我最近接管了一个 ASP.NET MVC 项目的支持,并且正在尝试解决一些错误,但其中一个错误尤其让我感到难过。
我们有一个“新建”页面来添加新项目,发布页面时运行以下代码:
[HttpPost]
public ActionResult New(RecordView i)
{
if(ModelState.IsValid)
{
repository.AddRecord(i.DogIncident);
return View("Index");
}
return View("Index");
}
但是,当它尝试加载索引 View 时,出现以下错误:“对象引用未设置为对象的实例。” 并且它指向以下代码块RecordsView.cshtml 文件的顶部:
@for (var i = 0; i < Model.Records.Count; i++)
虽然记录确实添加正确,但它只是没有正确加载列表页面,并且由于这只是一个“不错的选择”,我想我可以通过更改它来简化事情,以便它返回一些文本生成错误,因为它期望返回一个 bool 值。
关于如何解决这个问题有什么想法吗?我很难过。
谢谢!
最佳答案
这里的代码流程看起来不对:
[HttpPost]
public ActionResult New(RecordView i)
{
if(ModelState.IsValid)
{
repository.AddRecord(i.DogIncident);
return View("Index");
}
return View("Index");
}
根据您上面的描述,听起来好像您是从您的 New
发帖查看,对此New
操作,然后应该在成功时重定向到您的 Index
行动。目前,上面的代码没有这样做,如果模型无效,它也无法重新显示表单。它应该看起来更像这样:
[HttpPost]
public ActionResult New(RecordView i)
{
if(ModelState.IsValid)
{
repository.AddRecord(i.DogIncident);
return RedirectToAction("Index");
}
// Redisplay the `New` view, passing the model
// back to it in order to repopulate the form
return View(i);
}
return View(...)
之间的重要区别和 return RedirectToAction(...)
是后者将运行操作并 返回关联的 View 。前者只会返回 View 。这意味着如果 Index
action 构建模型,并将其传递给 Index
View ,如果您只是返回 View ,这些都不会发生。
你当然可以这样做:
return View("Index", new YourModelType());
但是如果如上所述,您的 Index
是行不通的action 为您的模型执行一些其他数据构建,例如构建下拉列表,new YourModelType()
不会的。
此外,当发送到 POST 操作的数据有效时,您应该重定向到另一个操作(正如我上面所做的),而不是简单地返回一个 View ,以符合 Post-Redirect-Get模式,可防止某些类型的重复表单提交。
关于ASP.NET MVC - 对象引用未设置为对象的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21025792/