1

在循环中,我试图将具有该类型的对象添加LocationList<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);
    }
}

视图模型:

public class HomeViewModel
{
    public string CitySearch { get; set; }

    public List<Location> Locations { get; set; }

}

model是 typeHomeViewModel和 propertyLocations是 type List<Location>。是来自在视图中提交表单的model表单操作的实例。HttpPost

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

任何的想法?

4

2 回答 2

2

任何的想法?

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

现在,为什么您的modelormodel.Locations属性为 null 是一个完全不同的问题。我猜您提交的表单不包含遵守standard naming conventions for binding to a List. 如果您希望默认模型绑定器能够在 POST 操作中重新水合您的模型,我邀请您熟悉这些约定并尊重它们。

也许您以某种方式放置了modelas action 参数并期望 ASP.NET MVC 会自动从某个地方填充它?不,这不是 ASP.NET MVC 的工作方式。没有魔法。ASP.NET MVC 使用具有严格规则的模型绑定器。只有您作为参数发送给操作的内容才是您期望得到的。

于 2013-01-08T21:48:27.193 回答
2

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

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

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

Locations = new List<Location>();

这会充分初始化您的属性以使用其方法。

于 2013-01-08T22:07:38.080 回答