asp.net-mvc – ASP.NET MVC – Html.Textbox()throws“对象引用
我遇到一个奇怪的问题….当我使用UpdateModel()或TryUpdateModel(),一切正常.当我尝试绑定自己(例如MyObject.FirstName = collection [“FirstName”])时,我得到一个“对象引用未设置为对象的实例”错误.
这有点难以解释,所以我将介绍代码: [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); } } 这是堆栈跟踪: 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) at ASP.views_event_create_aspx.__RenderContent2(HtmlTextWriter __w,Control parameterContainer) in d:TFSProjectsRedline Time AttackMainSourceRedline.RedlineTimeAttack.WebViewsEventCreate.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:TFSProjectsRedline Time AttackMainSourceRedline.RedlineTimeAttack.WebViewsSharedSite.Master:line 29 at System.Web.UI.Control.RenderChildrenInternal(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) at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint) InnerException: 解决方法
我在这里找到了一些洞察力:
http://forums.asp.net/p/1396019/3006051.aspx
所以我更新了我的代码如下: 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)); 我这样做的原因是因为我想要一个.在我的业务对象中完成所有(或尽可能多的)验证,包括必填字段和b.我在验证摘要中想要我自己的邮件(例如“FieldX是必填字段”,而不是“需要一个值”).如果有更好的方法,请参阅我的另一个问题:ASP.NET MVC – Custom validation message for value types (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – Mono上的ASP.NET MVC
- asp.net-mvc – 在ASP.NET MVC 3中等效的Flash
- asp.net-mvc – 有什么技巧/技巧使用亚音速与Asp.Net MVC框
- asp.net-mvc – 如何在.NET Web API项目中存储全局每个请求
- asp.net – Telerik RadGrid – 如何默认编辑模式?
- asp.net – 何时覆盖OnError?
- 在ASP.NET MVC 4中将jQuery 1.8.3更新为jQuery 1.9.0
- asp.net – 部署已发布的代码?
- asp.net – 脚本标记和“<%...%>”标记之间有什么区别?
- asp.net – 401向web api发送ajax请求时未经授权