2011-12-05 20 views
19

में Html.ValidationMessageFor को कैसे अनुकूलित करें Html.ValidationMessageFor विधि को अनुकूलित करना संभव है ताकि यह अलग-अलग HTML उत्पन्न कर सके?एएसपी एमवीसी

[MetadataType(typeof(YourMetaData))] 
public partial class YOURCLASS 
{ 
    [Bind(Exclude = "objID")] 
    public class YourMetaData 
    { 
     [Required(AllowEmptyStrings = false, ErrorMessage = "Please enter a name")] 
     public object Name { get; set; } 
    } 
} 

त्रुटिसंदेश क्षेत्र :) आशा इस मदद पर अपना संदेश बदलें:

<div class="field-error-box"> 
    <div class="top"></div> 
    <div class="mid"><p>This field is required.</p></div> 
</div> 

उत्तर

24

मुझे यकीन नहीं है कि डिफ़ॉल्ट span के बजाय p अनुच्छेद का उपयोग करना संभव है, क्योंकि यह वैल के लिए असंभव हो सकता है त्रुटि संदेशों को रखने के लिए idation प्लगइन। लेकिन divss के लिए, यह आसान है - आप कस्टम एचटीएमएल सहायक लिख सकते हैं।

इन पंक्तियों के साथ कुछ (को आगे परीक्षण/कोडिंग) की आवश्यकता हो सकती है। आपको अपने दृश्य में इस स्थिर विस्तार विधि का नामस्थान शामिल करना होगा, या इसे सीधे System.Web.Mvc.Html में डालना होगा।

public static class Validator 
{ 
    public static MvcHtmlString MyValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression) 
    { 
     TagBuilder containerDivBuilder = new TagBuilder("div"); 
     containerDivBuilder.AddCssClass("field-error-box"); 

     TagBuilder topDivBuilder = new TagBuilder("div"); 
     topDivBuilder.AddCssClass("top"); 

     TagBuilder midDivBuilder = new TagBuilder("div"); 
     midDivBuilder.AddCssClass("mid"); 
     midDivBuilder.InnerHtml = helper.ValidationMessageFor(expression).ToString(); 

     containerDivBuilder.InnerHtml += topDivBuilder.ToString(TagRenderMode.Normal); 
     containerDivBuilder.InnerHtml += midDivBuilder.ToString(TagRenderMode.Normal); 

     return MvcHtmlString.Create(containerDivBuilder.ToString(TagRenderMode.Normal)); 
    } 
} 

जैसा कि आप देख, यह डिफ़ॉल्ट ValidationMessageFor विधि का उपयोग करता, मान्यता-प्लगइन त्रुटि संदेश प्रसंस्करण के साथ हस्तक्षेप नहीं करने के लिए।

और तुम इस बस का उपयोग करें, डिफ़ॉल्ट सत्यापन संदेश सहायक

@Html.MyValidationMessageFor(model => model.SomeRequiredField) 
+0

यह मैं के लिए उपयोगी था। मैं अभी तक सत्यापन प्लगइन के साथ समस्या को समझ नहीं पा रहा हूं, लेकिन मैं इसे देख लूंगा। धन्यवाद! – parleer

+3

यह मेरे लिए अच्छा काम करता है, लेकिन System.Web.Mvc.Html नामस्थान में अपनी स्थिर सहायक वर्ग घोषित करना सुनिश्चित करें और यह वास्तव में अच्छा काम करेगा। –

+1

आप 'ValidationMessageFor' संदेश द्वारा उत्पन्न HTML को वास्तव में कैसे बदलते हैं। मैं इसे किसी अन्य div में लपेटने के बारे में बात नहीं कर रहा हूँ। क्या यह संभव है? –

-2

हाँ, बस क्षेत्र के लिए एक मेटामॉडल का उपयोग करें:

मैं के लिए इसी तरह कुछ करना चाहता हूँ:)

+0

वह कस्टम एचटीएमएल, नहीं कस्टम त्रुटि संदेश – archil

+0

ओह तोड़ा चाहता है, मुझे लगता है कि मैं समझता हूँ कि गलत तरीके से – shennyL

3

आप अपने वांछित उत्पादन फेंकना या जोड़ने के लिए कुछ जावास्क्रिप्ट का उपयोग करने के अपने खुद के ValidationMessageFor सहायक लागू कर सकते हैं के रूप में/गाया एचटीएमएल कोड लेकिन कस्टम ValidationMessageFor संशोधित कार्यान्वयन क्लीनर दृष्टिकोण IMHO है।

अपने स्वयं के प्रमाणीकरण को लागू करने के लिए मैसेज फॉर हेल्पर सत्यापन प्रमाणीकरण पर एक नज़र डालें। ValidationMessageFor और ValidationMessage ASP.NET MVC स्रोत कोड में सत्यापन विधि।

कार्यान्वयन संकेत

के बाद से GetFormContextForClientValidation आंतरिक है आप अपने कोड में आंतरिक कार्यक्षमता को दोहराने के क्रियान्वयन के आसपास काम करने के लिए है:

FormContext formContext = htmlHelper.ViewContext.ClientValidationEnabled ? htmlHelper.ViewContext.FormContext : null; 

कुछ अन्य तरीकों GetUserErrorMessageOrDefault की तरह क्या तुम करोगी ValidationExtensions में निजी हैं उस कोड को भी डुप्लिकेट करने की आवश्यकता है। डुप्लिकेटिंग कोड से बचने के लिए आप क्या कर सकते हैं ValidationExtentensions.ValidationMessage को एक स्पैन में लिपटे सत्यापन संदेश स्ट्रिंग को प्रस्तुत करने के लिए और बाद में अपनी आवश्यकताओं के अनुसार प्रस्तुत स्ट्रिंग को बदलें। ध्यान रखें कि यदि कोई त्रुटि नहीं मिली है तो आपको "शून्य" वापस कर दिया गया है और यदि आपके पास अविभाज्य जावास्क्रिप्ट सक्षम है तो आपको डेटा-HTML विशेषताओं की आवश्यकता होगी।

आप डिफ़ॉल्ट टैग पीढ़ी के परिवर्तन के लिए केवल जरूरत से here

2

ASP.NET MVC 3 स्रोत कोड डाउनलोड कर सकते हैं मेरे मामले, कि मार्जिन सेटअप anoying में व्यवहार परिणाम तक फैला में था।

मैं का उपयोग कर इस का समाधान 'प्रदर्शन: ब्लॉक'

हो सकता है कि यह कुछ लोगों को मदद मिलती है ..

public static MvcHtmlString DivValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) 
    { 
     return MvcHtmlString.Create(htmlHelper.ValidationMessageFor(expression).ToString().Replace("span", "div")); 
    } 

इस तरह से आप तरह से बनाया का उपयोग कर सकते हैं, लेकिन एक div के साथ अवधि बदलें:

7

मैं एक और तरीका इस्तेमाल किया।

आप समारोह के किसी भी अन्य भार के की जरूरत है, बस के रूप में आवश्यक नकल।

+0

मुझे यह दृष्टिकोण पसंद है। इस तरह के एक छोटे बदलाव के लिए सभी सत्यापन मैसेज हेल्पर कोड डुप्लिकेट करने से बहुत आसान है। –

+0

उम्मीद है कि आप दो बार के बीच की तारीख को मान्य नहीं करते हैं .. – user2864740

0

शायद तुम, जवाब समारोह के शीर्ष पर है कि कोड डाल सकते हैं

string propertyName = ExpressionHelper.GetExpressionText(expression); 
string name = helper.AttributeEncode(helper.ViewData.TemplateInfo.GetFullHtmlFieldName(propertyName)); 

if (helper.ViewData.ModelState[name] == null || 
    helper.ViewData.ModelState[name].Errors == null || 
    helper.ViewData.ModelState[name].Errors.Count == 0) 
    { 
     return MvcHtmlString.Empty; 
    } 

ताकि div प्रपत्र लोड पर प्रकट नहीं होता है।

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