मैं अपने आवेदन में एक जोरदार टाइप दृश्य में निम्न कोड: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]);
}
}
आपके सत्यापन कोड डाल, मैं जवाब के लिए लगता है कि समस्या है –