Asp.net mvc ASP.NET MVC-Html.Textbox()抛出;对象引用未设置为对象的实例;

Asp.net mvc ASP.NET MVC-Html.Textbox()抛出;对象引用未设置为对象的实例;,asp.net-mvc,Asp.net Mvc,我遇到了一个奇怪的问题……当我使用UpdateModel()或TryUpdateModel()时,一切正常。当我尝试绑定自己时(例如,MyObject.FirstName=collection[“FirstName”]),我得到一个“对象引用未设置为对象的实例”错误 这有点难以解释,因此我将介绍代码: [HandleError] [AcceptVerbs(HttpVerbs.Post)] public ActionResult Create(FormCollection

我遇到了一个奇怪的问题……当我使用
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);
            }
        }

enddate、startdate和trackId来自哪里?这甚至不应该编译,但也许我只是愚蠢,没有看到他们的声明。我肯定它就在看不见的地方,对吧


确保所有这些表单值实际上也包含内容。

我在这里找到了一些见解:

如果您不想使用内置模型 绑定,然后使用Bultin验证 (SanjaySutar想要使用),对于每个 如果您添加了ModelError,则需要 添加模型值: AddModelError(“名称”,“错误” 名称“)

SetModelValue(“名称”, ValueProvider[“名称])

因此,我更新了我的代码,如下所示:

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是必填字段”,而不是“value is required”)。如果有更好的方法,请参阅我的另一个问题:

不包括减速(复制和粘贴错误)。GetRuleViolations()中应捕获缺少的表单值。我主要考虑的是evnt.IsActive=collection[“IsActive”].Contains(“true”);线路。如果集合[“IsActive”]为null,则由于试图调用null对象上的函数,您将收到该错误。不过,很高兴看到你取得了进步!:)我在一个表单中遇到了这种情况,我正在将两个字段合并在一起并验证结果,但想报告单个(源)字段的错误。。。谢谢-救了我一个擦伤的前额!这就是为什么我喜欢stackoverflow,我可以用谷歌搜索我的异常,并在这里找到解决方案:)谢谢。
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));