2009-05-05 12 views
8

मैं अपने आवेदन में एक जोरदार टाइप दृश्य में निम्न कोड:NullReferenceException समस्या ASP.NET MVC पाठ बॉक्स HtmlHelper

<td> 
<label for="TriageStartDate">Triage Start:</label> 
<%= Html.TextBox("TriageStartDate", crit.TriageStartDate, new { maxlength = 10, size = 12 })%> 
<%= Html.ValidationMessage("TriageStartDate", "*") %> 
</td> 

चर crit ViewData में पारित हो जाता है और एक strongly- को डाला जाता है ध्यान में रखते हुए लिखी गई वस्तु का उपयोग कर:

:

PatientSearchCriteria crit = (PatientSearchCriteria)ViewData["criteria"];  

संपत्ति TriageStartDate एक स्ट्रिंग संपत्ति इतनी तरह वस्तु पर परिभाषित किया गया है

मेरे पास व्यापार ऑब्जेक्ट में एक सत्यापन दिनचर्या है जो इस संपत्ति को अमान्य तिथियों के लिए जांचती है। प्रमाणीकरण दिनचर्या को मेरे नियंत्रक में बुलाया जाता है, और नियंत्रक में जब मैं एक अवैध तिथि पाई जाती है (उदाहरण के लिए "4/34/2009") मॉडलस्टेट में मॉडलरर जोड़ें। इसके परिणामस्वरूप दृश्य को फिर से चलाया जा सकता है और सत्यापन सारांश और संदेश भी प्रदर्शित किया जा रहा है।

हालांकि, कोड Html.TextBox लाइन पर एक अनचाहे NullReferenceException के साथ क्रैश हो जाता है। कोड केवल अमान्य तिथियां दर्ज होने पर क्रैश हो जाती हैं, जो शायद इससे कोई फर्क नहीं पड़ता कि संपत्ति किसी स्ट्रिंग है, और इसे केवल टेक्स्टबॉक्स में अमान्य तिथि प्रदर्शित करनी चाहिए।

कोई विचार क्या हो रहा है? मैंने सोचा कि यह एक HTML हो सकता है। एन्कोड चीज, लेकिन मान्य तिथियां बिना किसी झगड़े के प्रदर्शित होती हैं। जब मैं डीबग मोड में उस पंक्ति को तोड़ता हूं, तो मैं TriageStartDate प्रॉपर्टी में "4/34/2009" मान देख सकता हूं, और आलोचक चर स्वयं शून्य नहीं है, इसलिए मैं सोच रहा हूं कि कौन सा ऑब्जेक्ट शून्य है?

Btw, स्टैक ट्रेस की पहली कुछ पंक्तियों इस तरह दिखेगा:

[NullReferenceException: Object reference not set to an instance of an object.] 
    System.Web.Mvc.HtmlHelper.GetModelStateValue(String key, Type destinationType) +63 
    System.Web.Mvc.Html.InputExtensions.InputHelper(HtmlHelper htmlHelper, InputType inputType, String name, Object value, Boolean useViewData, Boolean isChecked, Boolean setId, Boolean isExplicitValue, IDictionary`2 htmlAttributes) +519 
    System.Web.Mvc.Html.InputExtensions.TextBox(HtmlHelper htmlHelper, String name, Object value, IDictionary`2 htmlAttributes) +34 
    System.Web.Mvc.Html.InputExtensions.TextBox(HtmlHelper htmlHelper, String name, Object value, Object htmlAttributes) +62 

यहाँ मेरी सत्यापन कोड (सुंदर नहीं हो सकता है) है।

public override IEnumerable<ValidationError> GetValidationErrors() 
{ 
    // check for valid start date 
    if (!String.IsNullOrEmpty(TriageStartDate)) 
    { 
     DateTime critStartDate; 
     if (!DateTime.TryParse(TriageStartDate, out critStartDate)) 
      yield return new ValidationError(String.Format("Invalid triage start date specified: {0}", TriageStartDate), "TriageStartDate"); 
    } 

    // check for valid end date 
    if (!String.IsNullOrEmpty(TriageEndDate)) 
    { 
     DateTime critEndDate; 
     if (!DateTime.TryParse(TriageEndDate, out critEndDate)) 
      yield return new ValidationError(String.Format("Invalid triage end date specified: {0}", TriageEndDate), "TriageEndDate"); 
    } 

    // verify that end date follows start date if both are specified 
    if (!String.IsNullOrEmpty(TriageStartDate) && !String.IsNullOrEmpty(TriageEndDate)) 
    { 
     DateTime startDate; 
     DateTime endDate; 

     if (DateTime.TryParse(TriageStartDate, out startDate) && DateTime.TryParse(TriageEndDate, out endDate)) 
     { 
      if (startDate > endDate) 
       yield return new ValidationError("Triage start date must be before end date", "_FORM"); 
     } 
    } 

    yield break; 
} 

नियंत्रक में:

// validate search criteria 
    if (!criteria.IsValid) 
    { 
     foreach (ValidationError ve in criteria.GetValidationErrors()) 
     { 
      ModelState.AddModelError(ve.PropertyName, ve.ErrorMessage); 
     } 
    } 

किसी भी सुराग के लिए धन्यवाद व्यापार वस्तु में!


क्रेग के सुझावों के लिए धन्यवाद, मैंने नियंत्रक कोड को निम्नानुसार अपडेट किया है, और शून्य संदर्भ अपवाद समाप्त हो गया है। समाधान काम करता था, लेकिन मुझे यकीन नहीं है कि मैं तर्क को समझता हूं, क्योंकि जिस उपयोगकर्ता ने प्रवेश करने का प्रयास किया है वह पहले से ही मॉडल ऑब्जेक्ट में संग्रहीत है, और मेरे पास प्रोजेक्ट में अन्य दृश्य और नियंत्रक हैं जो सत्यापन विधि को उसी तरीके से प्रदर्शित कर रहे हैं कोई परेशानी। लेकिन, हे, अगर यह काम करता है ...

// validate search criteria 
    if (!criteria.IsValid) 
    { 
     foreach (ValidationError ve in criteria.GetValidationErrors()) 
     { 
      ModelState.AddModelError(ve.PropertyName, ve.ErrorMessage); 
      ModelState.SetModelValue(ve.PropertyName, form.ToValueProvider()[ve.PropertyName]); 
     } 

    } 
+0

आपके सत्यापन कोड डाल, मैं जवाब के लिए लगता है कि समस्या है –

उत्तर

9

के बाद आप AddModelError फोन आप SetModelValue कॉल करने के लिए की जरूरत है। यह शून्य संदर्भ को ठीक करना चाहिए।

+0

क्रेग, धन्यवाद, लेकिन मैं नियंत्रक या दृश्य में वस्तुओं में से किसी पर किसी भी SetAttempedValue विधि नहीं मिल रहा। मैं SetModelValue देखता हूं, लेकिन यह मुझे स्पष्ट नहीं है कि इसका उपयोग कैसे किया जाए - या यहां तक ​​कि अगर मुझे चाहिए - प्रकार के दूसरे पैरामीटर को ValueProviderResult दिया गया है, जिसे मैं नहीं जानता कि कैसे निर्माण करना है। मॉडल में वास्तव में उपयोगकर्ता द्वारा दर्ज किए गए प्रयास किए गए मान होते हैं, इसलिए मुझे यकीन नहीं है कि यह मुझे कहां छोड़ देता है। शायद कवर के तहत गहराई कहीं एएसपी.नेट एमवीसी मूल्य को एक तारीख में बदलने और समस्या होने की कोशिश कर रहा है ?? –

+0

एक तरीका Form.ToValueProvider() के साथ है ... –

+0

धन्यवाद, क्रेग। मैंने SetModelValue को FormProvueProvider विधि के साथ SetModelValue को रखने के लिए अपना कोड अपडेट किया है, और यह ValueProviderResult उत्पन्न करता है, और यह शून्य संदर्भ अपवाद को ठीक करता है। मैं अभी भी उलझन में हूं, लेकिन मेरा कोड काम करता है ... :-) –

1

मैं इस पर आया क्योंकि मैं लगभग समान प्रश्न/समस्या टाइप कर रहा था। (यानी, मेरे विचार को प्रतिपादित करने के लिए एक रहस्यमय NullReferenceException को फेंक दिया गया था जब उपयोगकर्ता का मान किसी विशेष फ़ील्ड पर सत्यापन विफल रहा था।

एक अलग काम-आसपास जो मैंने पाया है स्पष्ट रूप से दृश्य में एचटीएमएल उत्पन्न कर रहा है HtmlHelper को काम करने दें। <%= Html.TextArea("FieldName", Model.FieldName) %> एक अपवाद फेंक होगा, लेकिन <textarea id="FieldName" name="FieldName"><%= Model.FieldName ></textarea> बिल्कुल ठीक काम करेगा:

उदाहरण के लिए

अब के बाद से मूल प्रश्न पोस्ट करने के लिए धन्यवाद मैं देखना चाहता है जो दो तरीकों में से बेहतर समाधान है SetModelValue में देख कुछ और करना होगा ...