2011-11-16 15 views
8

ModelState.AddModelError için YENİ-LINE geçen MVC denetleyicisi ben o 'mesajı' ekran istiyorum
ModelState.AddModelError("", "message");
MVC3 - Bir hata arka uçta oluştuğunda

aracılığıyla bir mesaj döndürür 2 satır, bu yüzden bir "\r\n"
ya da bunların arasında bir "<br />" koymak istiyorum.

kullanıyorum Mesajı görüntülemek için Razor kullanıyorum @Html.ValidationSummary();
Ama Görünüm HTML Çıktı görüntüler bir mesaj üzerine Yeni-Çizgiler geçmek ve bunu elde etmek için en iyi yolu nedir &lt;br/&gt;

olarak HTML çıkış düzeyinde gerçek bir
etiketine yorumlanmış?

================================
Kontrolör kodu:

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

Görünüm kodu:

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

    .... 
} 
+0

daha fazla bilgi sunmak, ne yapmak istiyorum, lütfen? – dknaack

+0

ValidationSummary yardımcı otomatik olarak HTML, iletiyi kodlar. Bunu başarmak istiyorsanız özel bir yardım yazacaksınız. –

+0

@dknaack ... güncellendi. –

cevap

15

ValidationSummary yardımcı HTML'si hata iletilerini kodlar ve bu tasarım gereğidir. HTML etiketlerini kodlanacakları gibi kullanamayacağınız anlamına gelir. Sonra

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)); 
    } 
} 

ve:

:

@Html.MyValidationSummary() 

Açıkça HTML kodlamak değil bizim özel yardımcı aşağıdaki çizgidir Yani kodlamak değil özel bir yardımcı yazabilirsiniz orijinal yardımcı olarak

liBuilder.InnerHtml = userErrorMessageOrDefault; 

o şuna benzer:

liBuilder.SetInnerText(userErrorMessageOrDefault); 
+0

Teşekkürler Darin ... çok hassas ve değerli Cevap !!! –

+0

Her seferinde bir $ aldım, cevaplarınızdan biri bana Darin'den yardım ettiyse, şu an çalışmıyordum. – Chris

+0

B E A sadiful! Teşekkürler Darin. –

8

şöyle bir Html.Raw ve Server.HtmlDecode doğrulama özetini sarma deneyin:

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

Bu kod satırını koyduğumda, kısmi görünümü bile göstermiyor. Bana "500 dahili sunucu hatası" veriyor. –

+0

Cevabımı değiştirdim. Düzeltilmiş kodu sınandım ve hata iletisinde "
" bulunduğunda hata iletisini satır sonu ile döndürdüm. – counsellorben

+0

Sorun, @ Html.ValidationSummary ile; ViewBag.Temp ile değiştirmeyi denedim .. ve işe yaradı. Bu yüzden, tamamen değiştirmeyi düşünmeden önce ValidationSummary çalışmasını nasıl yapacağımızı öğrenmemiz gerekiyor. –

1

Bu geç bir cevaptır, ancak bu Google’ın en yüksek sonucudur, bu yüzden çözümüm birine yardımcı olabilir.

Bu sorunu giderdim ve her hata iletisi satırı için ayrı bir satır ekledim. Güzel görüntüler.

Kontrolör kodu:

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

Denetleyici:

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

Jilet:

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

Ekleme Environment.NewLine burada önerildiği gibi, benim için çalışmadı. – levteck

+0

@levteck Neden benim için çalışacağına dair bir düşünce var, değil mi? – ADH

İlgili konular