2011-11-16 7 views
8

ModelState.AddModelError को, MVC नियंत्रक
ModelState.AddModelError("", "message");MVC3 - गुजर नई-लाइन पीठ के अंत पर एक त्रुटि तब होती है जब

के माध्यम से संदेश देता रहा है कि 'संदेश' प्रदर्शन करना चाहते हैं 2 लाइनों, तो मैं एक "\r\n"
या एक "<br />" के बीच में डाल करना चाहते हैं।

मैं का उपयोग कर संदेश प्रदर्शित करने के लिए रेजर का उपयोग कर रहा @Html.ValidationSummary();
लेकिन दृश्य से HTML आउटपुट को प्रदर्शित करता है कि के रूप में &lt;br/&gt;

सबसे अच्छा तरीका है संदेश पर नई-लाइन्स गुजरती हैं और इसे पाने के लिए क्या है HTML आउटपुट स्तर पर वास्तविक
टैग में व्याख्या की गई?

================================
नियंत्रक कोड:

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

देखें कोड:

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

    .... 
} 
+0

कृपया अधिक जानकारियां प्रदान करते हैं कि आप क्या करना चाहते हैं? – dknaack

+0

सत्यापन प्रमाणीकरण सहायक स्वचालित रूप से HTML संदेश को एन्कोड करता है। यदि आप इसे प्राप्त करना चाहते हैं तो आपको एक कस्टम सहायक लिखना होगा। –

+0

@dknaack ... अपडेट किया गया। –

उत्तर

15

प्रमाणीकरण सारांश सहायक एचटीएमएल त्रुटि संदेशों को एन्कोड करता है और यह डिज़ाइन द्वारा है। इसका मतलब है कि आप एचटीएमएल टैग का उपयोग नहीं कर सकते क्योंकि उन्हें एन्कोड किया जाएगा।

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

और उसके बाद:

:

@Html.MyValidationSummary() 

यह हमारे कस्टम सहायक निम्न पंक्ति जो स्पष्ट रूप से एचटीएमएल एन्कोड नहीं करता है तो तुम जो एन्कोड नहीं करता एक कस्टम सहायक लिख सकता है

liBuilder.InnerHtml = userErrorMessageOrDefault; 

मूल सहायक में यह इस तरह दिखता है:

liBuilder.SetInnerText(userErrorMessageOrDefault); 
+0

धन्यवाद डैरिन ... बहुत ही सटीक और मूल्यवान जवाब !!! –

+0

अगर मुझे हर बार एक जवाब मिल गया तो आपके एक जवाब ने मुझे डारिन की मदद की, मैं अभी काम नहीं करूँगा। – Chris

+0

बी ई एक उपयोगी! धन्यवाद डारिन। –

8

, एक Html.Raw और एक Server.HtmlDecode में मान्यता सारांश लपेटकर का प्रयास करें ताकि जैसे:

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

जब मैं कोड की उस पंक्ति को डालता हूं, तो यह आंशिक दृश्य भी नहीं दिखाता है। यह मुझे "500 आंतरिक सर्वर त्रुटि" देता है। –

+0

मैंने अपना जवाब संशोधित किया। मैंने संशोधित कोड का परीक्षण किया, और त्रुटि संदेश में जब मैंने '
' था तो यह त्रुटि संदेश को लाइन ब्रेक के साथ वापस कर दिया। – counsellorben

+0

समस्या @ Html.ValidationSummary के साथ है; मैंने इसे ViewBag.Temp के साथ बदलने की कोशिश की .. और यह काम किया। इसलिए हमें इसे पूरी तरह से बदलने के बारे में सोचने से पहले सत्यापन प्रमाणीकरण कार्य कैसे करना है, यह जानने की आवश्यकता है। –

1

यह एक देर का उत्तर है, हालांकि यह Google का शीर्ष परिणाम है, इसलिए मेरा समाधान किसी की मदद कर सकता है।

मैं समस्या के चारों ओर चला गया और प्रत्येक त्रुटि संदेश लाइन के लिए एक अलग पंक्ति जोड़ा। खूबसूरती से प्रदर्शित करता है।

नियंत्रक कोड:

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

नियंत्रक:

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

उस्तरा:

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

पर्यावरण सम्मिलित करना। यहां प्रस्तावित के रूप में न्यूलाइन, मेरे लिए काम नहीं किया। – levteck

+0

@levteck कोई विचार नहीं कि यह मेरे लिए क्यों काम करेगा और आप नहीं? – ADH

संबंधित मुद्दे