2011-11-16 59 views
8

Khi một lỗi xảy ra trên back-end, bộ điều khiển MVC trả về một thông điệp qua
ModelState.AddModelError("", "message");MVC3 - đi NEW-LINE để ModelState.AddModelError

Tôi muốn có mà 'thông báo' trưng bày tại 2 dòng, vì vậy tôi muốn đặt một "\r\n"
hoặc một "<br />" ở giữa.

Tôi đang sử dụng Razor để hiển thị các tin nhắn sử dụng @Html.ValidationSummary();
Nhưng đầu ra HTML từ Xem hiển thị mà như &lt;br/&gt;

cách tốt nhất để vượt qua New-Dây chuyền nhắn và nhận được nó là gì diễn giải thành một thẻ
thực ở cấp độ đầu ra HTML?

================================
đang Bộ điều khiển:

ModelState.AddModelError("", "Line one <br /> Line two."); 
return Request.IsAjaxRequest() ? (ActionResult) PartialView("ViewName", model) 
      : View(model); 

Xem mã:

@using (Ajax.BeginForm("Index", "Home", new AjaxOptions { UpdateTargetId = "tv" })) 
{ 
    @if (Html.ValidationSummary() != null) 
     @Html.Raw(Server.HtmlDecode(Html.ValidationSummary(true).ToString())) 

    .... 
} 
+0

Vui lòng cung cấp thêm thông tin, những gì bạn muốn làm gì? – dknaack

+0

Trình trợ giúp ValidationSummary tự động mã hóa HTML tin nhắn. Bạn sẽ phải viết một trình trợ giúp tùy chỉnh nếu bạn muốn đạt được điều đó. Đã cập nhật –

+0

@dknaack .... –

Trả lời

15

Trình trợ giúp ValidationSummary HTML mã hóa thông báo lỗi và điều này là do thiết kế. Nó có nghĩa là bạn không thể sử dụng các thẻ HTML vì chúng sẽ được mã hóa. Vì vậy, bạn có thể viết một helper tùy chỉnh mà không mã hóa:

public static class ValidationExtensions 
{ 
    public static IHtmlString MyValidationSummary(this HtmlHelper htmlHelper) 
    { 
     var formContextForClientValidation = htmlHelper.ViewContext.ClientValidationEnabled ? htmlHelper.ViewContext.FormContext : null; 
     if (htmlHelper.ViewData.ModelState.IsValid) 
     { 
      if (formContextForClientValidation == null) 
      { 
       return null; 
      } 
      if (htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled) 
      { 
       return null; 
      } 
     } 

     var stringBuilder = new StringBuilder(); 
     var ulBuilder = new TagBuilder("ul"); 

     ModelState modelState; 
     if (htmlHelper.ViewData.ModelState.TryGetValue(htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix, out modelState)) 
     { 
      foreach (ModelError error in modelState.Errors) 
      { 
       string userErrorMessageOrDefault = error.ErrorMessage; 
       if (!string.IsNullOrEmpty(userErrorMessageOrDefault)) 
       { 
        var liBuilder = new TagBuilder("li"); 
        liBuilder.InnerHtml = userErrorMessageOrDefault; 
        stringBuilder.AppendLine(liBuilder.ToString(TagRenderMode.Normal)); 
       } 
      } 
     } 

     if (stringBuilder.Length == 0) 
     { 
      stringBuilder.AppendLine("<li style=\"display:none\"></li>"); 
     } 
     ulBuilder.InnerHtml = stringBuilder.ToString(); 

     TagBuilder divBuilder = new TagBuilder("div"); 
     divBuilder.AddCssClass(htmlHelper.ViewData.ModelState.IsValid ? HtmlHelper.ValidationSummaryValidCssClassName : HtmlHelper.ValidationSummaryCssClassName); 
     divBuilder.InnerHtml = ulBuilder.ToString(TagRenderMode.Normal); 
     if (formContextForClientValidation != null) 
     { 
      if (!htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled) 
      { 
       divBuilder.GenerateId("validationSummary"); 
       formContextForClientValidation.ValidationSummaryId = divBuilder.Attributes["id"]; 
       formContextForClientValidation.ReplaceValidationSummary = false; 
      } 
     } 
     return new HtmlString(divBuilder.ToString(TagRenderMode.Normal)); 
    } 
} 

và sau đó:

@Html.MyValidationSummary() 

Đây là dòng sau trong helper tùy chỉnh của chúng tôi mà dứt khoát không HTML mã hóa:

liBuilder.InnerHtml = userErrorMessageOrDefault; 

Trong helper gốc nó trông như thế này:

liBuilder.SetInnerText(userErrorMessageOrDefault); 
+0

Cảm ơn Darin ... rất chính xác và có giá trị câu trả lời !!! –

+0

Nếu tôi nhận được $ cho mỗi lần một trong những câu trả lời của bạn đã giúp tôi trong Darin, tôi sẽ không làm việc ngay bây giờ. – Chris

+0

B E Rất đáng yêu! Cảm ơn Darin. –

8

Hãy thử gói tóm tắt xác nhận trong một Html.Raw và một Server.HtmlDecode, như vậy:

@Html.Raw(Server.HtmlDecode(Html.ValidationSummary().ToString())) 
+0

Khi tôi đặt dòng mã đó, nó thậm chí không hiển thị một phần xem. Nó mang lại cho tôi một "500 lỗi máy chủ nội bộ". –

+0

Tôi đã sửa đổi câu trả lời của mình. Tôi đã kiểm tra mã sửa đổi và nó trả về thông báo lỗi với ngắt dòng khi tôi có '
' trong thông báo lỗi. – counsellorben

+0

Vấn đề là với @ Html.ValidationSummary; Tôi đã thử thay thế nó bằng ViewBag.Temp .. và nó đã hoạt động. Vì vậy, chúng ta cần tìm hiểu cách làm cho công việc ValidationSummary trước khi chúng ta bắt đầu suy nghĩ để thay thế nó hoàn toàn. –

1

Đây là câu trả lời trễ, tuy nhiên đây là kết quả hàng đầu khi tôi Google, vì vậy giải pháp của tôi có thể giúp ai đó.

Tôi đã giải quyết vấn đề và thêm một dòng riêng biệt cho từng dòng thông báo lỗi. Hiển thị đẹp mắt.

đang điều khiển:

public ActionResult Edit(EditModel model) 
    { 
      try 
      { 
       //... do update 
      } 
      catch (Exception ex) 
      { 
       if (ex.Message.Contains(Environment.NewLine)) 
       { 
        var messages = ex.Message.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); 
        foreach (var message in messages) 
        { 
         this.ModelState.AddModelError(string.Empty, message); 
        } 
       } 
       else 
       { 
        this.ModelState.AddModelError(string.Empty, ex.Message); 
       } 
      } 
     //... 

     return this.View(model); 
    } 
0

Bộ điều khiển:

ModelState.AddModelError("MyError", "Line 1" + Environment.NewLine + "Line 2"); 

Razor:

<span style="white-space: pre-line">@Html.ValidationSummary()</span> 
+0

Môi trường chèn.NewLine như được đề xuất ở đây, không hoạt động đối với tôi. – levteck

+0

@levteck Bất kỳ suy nghĩ nào về lý do tại sao nó sẽ phù hợp với tôi chứ không phải bạn? – ADH

Các vấn đề liên quan