在循环内部我正在尝试将类型为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);
}
}
视图模型:
public class HomeViewModel
{
public string CitySearch { get; set; }
public List<Location> Locations { get; set; }
}
model
的类型为HomeViewModel
,属性Locations
的类型为List<Location>
。 model
是来自视图中提交表单的表单HttpPost
操作的实例。
我正在调试,错误发生在model.Locations.Add(location)
,我得到object reference not set to an instance of an object.
和nullref异常。
有什么想法吗?
答案 0 :(得分:2)
有什么想法吗?
是的,model
变量为null或Locations
属性为null。因此,在访问model.Locations
之前,请确保它们不为空。否则你得到的例外是完全正常的。您无法在空实例上调用方法。顺便说一下,您可以使用标准调试技术(在代码中放置断点,在调试模式下运行应用程序并检查变量的值)会导致您得出相同的结论。
现在为什么model
或model.Locations
属性为null是一个非常不同的问题。我猜您提交的表单不包含符合standard naming conventions for binding to a List
的输入元素。如果您希望默认模型绑定器能够在POST操作中为模型补充水分,我邀请您熟悉这些约定并尊重它们。
也许某种程度上你把model
作为动作参数,并期望ASP.NET MVC会从某些地方自动填充它?不,这不是ASP.NET MVC的工作原理。没有魔力。 ASP.NET MVC使用具有严格规则的模型绑定器。只有您作为动作参数发送的内容才是您可以期待的结果。
答案 1 :(得分:2)
根据您的反应和上下文,似乎您的Locations
属性当时未初始化,因此您无法在此集合上使用方法Add
。要解决此问题,您需要先初始化此属性,然后以任何方式操作它。
实现此目的的一种方法是在模型的构造函数中(或您认为合适的任何位置)初始化Locations
属性。
所以只需添加这样的内容就可以了:
Locations = new List<Location>();
这会初始化您的属性以使用其方法。