ASP.net MVC列表nullreference异常

本文关键字:nullreference 异常 列表 MVC net ASP | 更新日期: 2023-09-27 17:50:59

在一个循环中,我试图将一个类型为Location的对象添加到List<Location>属性。

控制器:

 [HttpPost]
 public ActionResult Index([Bind(Include = "CitySearch")]HomeViewModel model)
 {
    List<CityIdentity> ids = null;
    ids = service.GetNamesId(model.CitySearch);
    foreach (var id in ids)
    {
        var loc = service.GetLocation(id.CityId);
        var location = new Location
        {
            CityId = id.CityId,
            Place = loc.Place,
        };
        model.Locations.Add(location);
    }
}

VIEWMODEL:

public class HomeViewModel
{
    public string CitySearch { get; set; }
    public List<Location> Locations { get; set; }
}

model属于HomeViewModel类型,Locations属于List<Location>类型。model是表单的实例,HttpPost是在View中提交表单时的动作。

我正在调试,错误发生在model.Locations.Add(location),我得到object reference not set to an instance of an object.和nullref异常。

任何想法?

ASP.net MVC列表nullreference异常

根据您的反应和上下文,似乎您的Locations属性当时未初始化,因此您不能在此集合上使用Add方法。为了克服这个问题,你需要先初始化这个属性,然后你可以用任何你需要的方式来操作它。

实现这一点的一种方法是在你的模型的构造函数中初始化你的Locations属性(或者任何你认为合适的地方)。

所以只要加上这样的东西,你就可以开始了:

Locations = new List<Location>();

这足以初始化你的属性以使用它的方法。

任何想法?

是的,model变量为空或者Locations属性为空。因此,在访问model.Locations之前,请确保它们不是空的。否则,你得到的例外是完全正常的。不能在空实例上调用方法。顺便说一下,您可以使用标准的调试技术(在代码中设置断点,在Debug模式下运行应用程序并检查变量的值)将导致您得出相同的结论。

现在为什么你的modelmodel.Locations属性是null是一个完全不同的问题。我猜您提交的表单没有包含遵守standard naming conventions for binding to a List的输入元素。如果您希望默认的模型绑定器能够在POST操作中为您的模型补充水分,我建议您熟悉这些约定,并尊重它们。

也许您不知何故将model作为操作参数并期望ASP。. NET MVC会自动从某处填充它吗?不,ASP不是这样的。NET MVC工作。没有魔法。ASP。. NET MVC使用有严格规则的模型绑定器。

只有作为参数发送给操作的内容才能期望得到返回。