2009-12-17 10 views
5

मैं एक कस्टम एचटीएमएल हेल्पर बनाने की कोशिश कर रहा हूं जो कुछ प्रस्तुति तर्क को समाहित करता है क्योंकि मुझे इस तर्क को एक ही पृष्ठ पर और शायद भविष्य में दो बार पुन: उपयोग करना होगा।मैं अपने स्वयं के कस्टम सहायक के अंदर एएसपी.नेट एमवीसी सत्यापन मैसेज एचटीएमएल हेल्पर का उपयोग कैसे करूं?

यदि उपयोगकर्ता का पता उत्तरी अमेरिका में है, तो मैं टेलीफोन नंबर इनपुट के लिए दो टेक्स्ट बॉक्स प्रदर्शित करना चाहता हूं, एक क्षेत्र कोड के लिए और दूसरे नंबर के शेष के लिए। अगर पता उत्तरी अमेरिका के बाहर है, तो मैं पूर्ण संख्या के लिए एक टेक्स्ट बॉक्स प्रदर्शित करना चाहता हूं।

निम्न कोड सही टेक्स्ट बॉक्स को आउटपुट करने के उद्देश्य से काम कर रहा था, हालांकि, जैसे ही मैंने प्रत्येक टेक्स्ट बॉक्स से जुड़े सत्यापन को जोड़ा, अब मुझे प्रमाणीकरण मैसेज हेल्पर पर ToString() कॉल से फेंक दिया गया NullReferenceException प्राप्त हो रहा है कॉल (प्रमाणीकरण मैसेज हेल्पर एक शून्य वापस आ रहा है !!)।

public static string TelephoneNumberInputListItem(this HtmlHelper helper, 
             string country, 
             string northAmericanAreaCodeFormName, 
             string northAmericanAreaCode, 
             string northAmericanRemainingNumberFormName, 
             string northAmericanRemainingNumber, 
             string internationalFullNumberFormName, 
             string internationalFullNumber) 
    { 

     //set up the error message and styling 
     object errorHtmlAttributes = new { @class = "fError" }; 
     string validationMessage = "*"; 

     object htmlAttributes; 

     //start building our list item tag which includes our telephone number 
     //input and validation controls 
     TagBuilder listItemBuilder = new TagBuilder("li"); 

     //determine based on the country specified if this should be a North 
     //American phone input form or an international one 
     if (isNorthAmericanCountry(country)) 
     { 
      //add the text input controls 
      htmlAttributes = new { size = 3, maxlength = 3 }; 
      listItemBuilder.InnerHtml = helper.TextBox(northAmericanAreaCodeFormName, northAmericanAreaCode, htmlAttributes).ToString(); 

      htmlAttributes = new { size = 7, maxlength = 7 }; 
      listItemBuilder.InnerHtml += helper.TextBox(northAmericanRemainingNumberFormName, northAmericanRemainingNumber, htmlAttributes).ToString(); 

      //Add the Validation Message controls 
      listItemBuilder.InnerHtml += helper.ValidationMessage(northAmericanAreaCodeFormName, validationMessage, errorHtmlAttributes).ToString(); 
      listItemBuilder.InnerHtml += helper.ValidationMessage(northAmericanRemainingNumberFormName, validationMessage, errorHtmlAttributes).ToString(); 
     } 
     else 
     { 
      //add the text input control 
      htmlAttributes = new { size = 15, maxlength = 15 }; 
      listItemBuilder.InnerHtml = helper.TextBox(internationalFullNumberFormName, internationalFullNumber, htmlAttributes).ToString(); 

      //Add the Validation Message control 
      listItemBuilder.InnerHtml += helper.ValidationMessage(internationalFullNumberFormName, validationMessage, errorHtmlAttributes).ToString(); 
     } 

     return listItemBuilder.ToString(TagRenderMode.Normal); 
    } 

आप कृपया मेरी मदद कर सकते मुझे मान्यता जोड़ सकते हैं ताकि इन इनपुट पाठ बॉक्स अभी भी बुला देखें में क्या हो रहा समग्र फ़ॉर्म सत्यापन का हिस्सा हैं? मुझे जिक्र करना चाहिए कि टेक्स्टबॉक्स और सत्यापन मैसेज हेल्पर सीधे दृश्य में डालने से सही तरीके से काम करता है।

एचटीएमएल हेल्पर्स ("यदि कोई आईएफ है, तो किसी सहायक का उपयोग करें" का उपयोग करने के लिए बहुत सारी चर्चा है), लेकिन अगर हम इनपुट नियंत्रण में सत्यापन नियंत्रण नहीं जोड़ सकते हैं तो हम उन्हें कैसे उपयोग कर सकते हैं उपयोग।

आपकी मदद के लिए अग्रिम धन्यवाद।

उत्तर

4

मान्य मॉडल स्थिति में कोई त्रुटि नहीं होने पर सत्यापन मैसेज हेल्पर शून्य हो जाता है। नीचे वास्तविक कोड देखें ...

चूंकि प्रमाणीकरण मैसेज सहायक एक स्ट्रिंग देता है, इसलिए ToString() (जो अपवाद पैदा कर रहा है) को कॉल करने का कोई कारण नहीं है। ToString को हटाएं और आपके कोड को अपेक्षित कार्य करना चाहिए।

आप टेक्स्टबॉक्स सहायताकर्ताओं से भी अपनी ToString कॉल को भी हटा सकते हैं।

public static string ValidationMessage(this HtmlHelper htmlHelper, string modelName, string validationMessage, IDictionary<string, object> htmlAttributes) { 
    if (modelName == null) { 
    throw new ArgumentNullException("modelName"); 
    } 

    if (!htmlHelper.ViewData.ModelState.ContainsKey(modelName)) { 
    return null; 
    } 

    ModelState modelState = htmlHelper.ViewData.ModelState[modelName]; 
    ModelErrorCollection modelErrors = (modelState == null) ? null : modelState.Errors; 
    ModelError modelError = ((modelErrors == null) || (modelErrors.Count == 0)) ? null : modelErrors[0]; 

    if (modelError == null) { 
    return null; 
    } 

    TagBuilder builder = new TagBuilder("span"); 
    builder.MergeAttributes(htmlAttributes); 
    builder.MergeAttribute("class", HtmlHelper.ValidationMessageCssClassName); 
    builder.SetInnerText(String.IsNullOrEmpty(validationMessage) ? GetUserErrorMessageOrDefault(htmlHelper.ViewContext.HttpContext, modelError, modelState) : validationMessage); 

    return builder.ToString(TagRenderMode.Normal); 
} 
+0

धन्यवाद यह स्पष्ट करने के लिए mkedobbs धन्यवाद कि मॉडलस्टेट में कोई त्रुटि नहीं होने पर सत्यापन मैसेज हेल्पर शून्य हो जाता है। ToString() को हटाने से मेरी समस्या हल हो जाती है, लेकिन कारण यह है कि मेरे पास पहली जगह क्यों थी क्योंकि हेल्पर्स MVCHtmlString को वापस लौटाते हैं, जिसे मैं कास्टिंग के माध्यम से स्ट्रिंग में कनवर्ट करने में सक्षम नहीं हूं। किसी भी तरह, हालांकि, इस MVCHtmlString को किसी अन्य स्ट्रिंग (मेरे मामले में + = ऑपरेटर का उपयोग करके) में संयोजित करना इसे स्ट्रिंग में सफलतापूर्वक परिवर्तित करता है, इसलिए समस्या हल हो जाती है। – FullOfQuestions

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

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