2009-03-15 10 views
13

मुझे एक अजीब समस्या का सामना करना पड़ा .... जब मैं UpdateModel() या TryUpdateModel() का उपयोग करता हूं, तो सब कुछ ठीक काम करता है। जब मैं खुद को बाध्य करने का प्रयास करता हूं (उदा। MyObject.FirstName = collection["FirstName"]), मुझे "Object reference not set to an instance of an object" त्रुटि मिलती है।एएसपी.नेट एमवीसी - एचटीएमएल। टेक्स्टबॉक्स() ऑब्जेक्ट संदर्भ किसी ऑब्जेक्ट के उदाहरण पर सेट नहीं है "

यह समझाने के लिए एक छोटे से मुश्किल है, इसलिए मैं कोड को पेश करेंगे:

System.NullReferenceException was unhandled by user code 
Message="Object reference not set to an instance of an object." 
Source="System.Web.Mvc" 
StackTrace: 
    at System.Web.Mvc.HtmlHelper.GetModelStateValue(String key, Type destinationType) 
    at 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) 
    at System.Web.Mvc.Html.InputExtensions.TextBox(HtmlHelper htmlHelper, String name, Object value, IDictionary`2 htmlAttributes) 
    at System.Web.Mvc.Html.InputExtensions.TextBox(HtmlHelper htmlHelper, String name) 
    at ASP.views_event_create_aspx.__RenderContent2(HtmlTextWriter __w, Control parameterContainer) in d:\TFSProjects\Redline Time Attack\Main\Source\Redline.RedlineTimeAttack.Web\Views\Event\Create.aspx:line 18 
    at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) 
    at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) 
    at System.Web.UI.Control.Render(HtmlTextWriter writer) 
    at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) 
    at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) 
    at System.Web.UI.Control.RenderControl(HtmlTextWriter writer) 
    at ASP.views_shared_site_master.__Render__control1(HtmlTextWriter __w, Control parameterContainer) in d:\TFSProjects\Redline Time Attack\Main\Source\Redline.RedlineTimeAttack.Web\Views\Shared\Site.Master:line 29 
    at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) 
    at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) 
    at System.Web.UI.Control.Render(HtmlTextWriter writer) 
    at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) 
    at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) 
    at System.Web.UI.Control.RenderControl(HtmlTextWriter writer) 
    at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) 
    at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) 
    at System.Web.UI.Page.Render(HtmlTextWriter writer) 
    at System.Web.Mvc.ViewPage.Render(HtmlTextWriter writer) 
    at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) 
    at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) 
    at System.Web.UI.Control.RenderControl(HtmlTextWriter writer) 
    at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
InnerException: 

उत्तर

22

मैं यहाँ कुछ जानकारी मिली: http://forums.asp.net/p/1396019/3006051.aspx

आप अंतर्निहित मॉडल बाध्यकारी है, तो Bultin मान्यता (SanjaySutar उपयोग करना चाहते हैं), उपयोग करने के लिए हर ModelError आप जोड़ना के लिए उपयोग नहीं करना चाहते हैं, आपको की आवश्यकता होगी मॉडलवैल्यू: मॉडलस्टेट। AddModelError ("नाम", "खराब नाम");

मॉडलस्टेट .etModelValue ("नाम", वैल्यूप्रोवाइडर ["नाम"]);

तो मैं बहुत तरह मेरे कोड अद्यतन:

ModelState.SetModelValue("Description", new ValueProviderResult(ValueProvider["Description"].AttemptedValue, collection["Description"], System.Globalization.CultureInfo.CurrentCulture)); 
ModelState.SetModelValue("EventName", new ValueProviderResult(ValueProvider["EventName"].AttemptedValue, collection["EventName"], System.Globalization.CultureInfo.CurrentCulture)); 
ModelState.SetModelValue("EndDate", new ValueProviderResult(ValueProvider["EndDate"].AttemptedValue, collection["EndDate"], System.Globalization.CultureInfo.CurrentCulture)); 
ModelState.SetModelValue("StartDate", new ValueProviderResult(ValueProvider["StartDate"].AttemptedValue, collection["StartDate"], System.Globalization.CultureInfo.CurrentCulture)); 
ModelState.SetModelValue("TrackId", new ValueProviderResult(ValueProvider["TrackId"].AttemptedValue, collection["TrackId"], System.Globalization.CultureInfo.CurrentCulture)); 
ModelState.SetModelValue("WebContent", new ValueProviderResult(ValueProvider["WebContent"].AttemptedValue, collection["WebContent"], System.Globalization.CultureInfo.CurrentCulture)); 

कारण मैं यह कर रहा हूँ क्योंकि मैं एक करना चाहता था। मेरे व्यापार ऑब्जेक्ट में किए गए सभी (या जितना संभव हो) सत्यापन, आवश्यक फ़ील्ड समेत, और बी। मैं सत्यापन के सारांश में अपने स्वयं के संदेश चाहता था (उदाहरण के लिए "एक मान आवश्यक है" के बजाय "फील्डएक्स एक आवश्यक फ़ील्ड है।")। यदि ऐसा करने का एक बेहतर तरीका है, तो कृपया मेरा अन्य प्रश्न देखें: ASP.NET MVC - Custom validation message for value types

+0

अंतर्दृष्टि के लिए धन्यवाद! – John

+0

मुझे इस फ़ॉर्म का सामना करना पड़ा जहां मैं दो क्षेत्रों को एक साथ जोड़ रहा था और परिणाम को मान्य कर रहा था, लेकिन व्यक्तिगत (स्रोत) फ़ील्ड पर त्रुटियों की रिपोर्ट करना चाहता था ... धन्यवाद - मुझे एक कटा हुआ माथे बचाया! – GalacticCowboy

+4

यही कारण है कि मैं स्टैक ओवरफ्लो से प्यार करता हूं, मैं अपने अपवादों को Google कर सकता हूं, और यहां समाधान ढूंढ सकता हूं :) धन्यवाद। –

0

कहाँ ENDDATE, StartDate, और TrackID से आ रही है:

[HandleError] 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(FormCollection collection) 
    { 
     try 
     { 
      Model.Event evnt = new Redline.RedlineTimeAttack.Model.Event(); 

      //When this is uncommented everything works fine. 
      //TryUpdateModel<Model.Event>(evnt); 

      //this will eventually lead to problems 
      evnt.Description = collection["Description"]; 
      evnt.EndDate = enddate; 
      evnt.EventName = collection["EventName"]; 
      evnt.IsActive = collection["IsActive"].Contains("true"); 
      evnt.StartDate = startdate; 
      evnt.TrackId = trackId; 
      evnt.WebContent = collection["WebContent"]; 


      if (!evnt.IsValid) 
      { 
       foreach (var error in evnt.GetRuleViolations()) 
       { 
       ModelState.AddModelError(error.PropertyName, error.ErrorMessage); 
       } 
      } 

      //If there are no validation issues then no problem, redirecttoaction 
      //works properly 
      if (ModelState.IsValid) 
      { 
       model.Events.InsertOnSubmit(evnt); 
       model.SubmitChanges(); 
       ViewData["ControlMode"] = "Edit"; 
       return RedirectToAction("Edit"); 
      } 
      else //returning to View so that user can correct issues causes a null reference error in the view (bombs at first Html.Textbox("ControlName")) 
      { 
       ViewData["Tracks"] = GetTracks(); 
       return View("Create", evnt); 
      } 
     } 

यहाँ स्टैक ट्रेस है? यह संकलन भी नहीं करना चाहिए, लेकिन हो सकता है कि मैं सिर्फ गूंगा हूं और उनकी घोषणाओं को नहीं देख रहा हूं। मुझे यकीन है कि यह सिर्फ दृष्टि से बाहर है, है ना?

सुनिश्चित करें कि उन सभी रूपों के मूल्यों में वास्तव में उनके पास सामान भी है।

+0

डिकलेरेशन शामिल नहीं थे (कॉपी और पेस्ट त्रुटि)। गेट फॉर्म मानों को GetRuleViolations() –

+0

में पकड़ा जाना चाहिए, मैं मुख्य रूप से evnt.IsActive = संग्रह ["IsActive"] के बारे में सोच रहा था। इसमें ("सत्य") शामिल है; लाइन। यदि संग्रह ["IsActive"] शून्य है तो आपको उस त्रुटि को एक शून्य ऑब्जेक्ट पर फ़ंक्शन कॉल करने का प्रयास करने के कारण प्राप्त होगा। आपको प्रगति करने के लिए खुशी हुई, हालांकि! :) –

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

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