2011-11-22 13 views
11

मैं देख सकता हूं कि मेरा ModelState.Values[x].Errors एक ही संपत्ति के लिए दो सत्यापन त्रुटियों के साथ सही ढंग से पॉप्युलेट किया गया है।@ HTML.ValidationMessageFor के साथ एकाधिक सत्यापन त्रुटियों को कैसे प्रदर्शित करें?

यदि मैं अपने दृश्य में @Html.ValidationSummary() का उपयोग करता हूं, तो यह पृष्ठ के शीर्ष पर यद्यपि सही ढंग से दोनों त्रुटियों को प्रदर्शित करता है, और अपमानजनक इनपुट के बगल में नहीं।

@Html.ValidationMessageFor(model => model.MyProperty) का उपयोग प्रदर्शित करता है पहली संपत्ति केवल उस संपत्ति के लिए!

उचित इनपुट के बगल में, मैं दोनों त्रुटियों को कैसे दिखा सकता हूं?

उत्तर

10

एक समाधान है एचटीएमएलहेल्पर पर अपनी खुद की विस्तार विधि को कार्यान्वित करना जो डिफ़ॉल्ट प्रमाणीकरण मैसेज के लिए कुछ अलग करता है। नमूना @ Html.ValidationMessages नीचे विधि नीचे कई त्रुटि संदेशों को जोड़ देगा जो मॉडलस्टेट में सर्वर-साइड सत्यापन (केवल) के दौरान मॉडलस्टेट में जोड़े गए हैं।

public static MvcHtmlString ValidationMessagesFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes = null) 
{ 
    var propertyName = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).PropertyName; 
    var modelState = htmlHelper.ViewData.ModelState; 

    // If we have multiple (server-side) validation errors, collect and present them. 
    if (modelState.ContainsKey(propertyName) && modelState[propertyName].Errors.Count > 1) 
    { 
     var msgs = new StringBuilder(); 
     foreach (ModelError error in modelState[propertyName].Errors) 
     { 
      msgs.AppendLine(error.ErrorMessage); 
     } 

     // Return standard ValidationMessageFor, overriding the message with our concatenated list of messages. 
     return htmlHelper.ValidationMessageFor(expression, msgs.ToString(), htmlAttributes as IDictionary<string, object> ?? htmlAttributes); 
    } 

    // Revert to default behaviour. 
    return htmlHelper.ValidationMessageFor(expression, null, htmlAttributes as IDictionary<string, object> ?? htmlAttributes); 
} 

यदि आप कस्टम व्यवसाय मान्यता आप एक संग्रह अपने मॉडल से संबंधित भर में लागू कर रहे हैं (उदाहरण के लिए, पार से जाँच योग), या एक पूरे के रूप में मॉडल की जाँच की है उपयोगी है।

एक उदाहरण इस का उपयोग करते हुए, जहां Order.LineItems का एक संग्रह सर्वर साइड मान्य किए जाते हैं:

@using MyHtmlHelperExtensions // namespace containing ValidationMessagesFor 
@using (Html.BeginForm()) 
{ 
    @Html.LabelFor(m => m.LineItems) 
    <ul> 
     @Html.EditorFor(m => m.LineItems) 
    </ul> 
    @Html.ValidationMessagesFor(m => m.LineItems) 
} 
+0

अच्छा समाधान में किसी भी उपसर्गों का ख्याल रखता है। क्या यह नेडेड दृश्यों के साथ नेस्टेड दृश्यों के साथ काम करता है? मुझे निम्नलिखित जोड़ना पड़ा: 'var relativePropertyName = ExpressionHelper.GetExpressionText (अभिव्यक्ति);' 'var propertyName = String.Format (" {0} {2} {1} ", htmlHelper.ViewContext.ViewData.TemplateInfo। HtmlFieldPrefix, relativePropertyName, (String.IsNullOrWhiteSpace (relativePropertyName) String.Empty: "।")); ' – Fiddles

+0

सरल तरीका यह नेस्टेड दृश्यों के साथ काम करने के लिए प्राप्त करने के लिए है: प्रॉपर्टी = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName (प्रॉपर्टी) –

+0

उत्कृष्ट जवाब, और यह काम करता है। सिवाय इसके कि मेरी दोनों त्रुटियां एक ही पंक्ति पर हैं। मुझे प्रत्येक त्रुटि संदेश की अपनी लाइन पर होना चाहिए। उदाहरण के लिए
टैग के साथ – theB3RV

3

जवाब डेव एक-W प्रदान की अनिवार्य रूप से सही है लेकिन सभी मामलों में काम नहीं करेगा। सही संपत्ति नाम प्राप्त करने के लिए MVC 3 के स्रोत कोड का उपयोग करता है:

var propertyName = ExpressionHelper.GetExpressionText(expression); 

यह फार्म डेटा

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

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