ASP.NET MVC - 对象引用未设置为对象的实例

标签 asp.net asp.net-mvc

我最近接管了一个 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/

相关文章:

c# - 在 Visual C# 中对新记录和更新记录使用相同的形式

c# - Linq-To-Entities 'Contains' 子句 1-many 关系

javascript - 通过 JSON 将 javascript 参数字典发送到 MVC Controller

c# - TryUpdateModel 和 System.MissingMethodException

c# - EF 代码首先使用空查找表设置外键

c# - 可以通过 C# 将类添加到对象的现有类属性吗?

asp.net - 如何自定义 ASP.NET Web API AuthorizeAttribute 以满足异常需求

用户控件内的 JavaScript 不运行

c# - 生产数据库迁移 ASP.NET MVC 4

来自第 3 方的 C# 流响应,最小缓冲