我正在构建一个简单的MVC应用程序来执行CRUD应用程序。我有两个简单的模型类。
public class MoniModel
{
public int ProductId { get; set; }
public string ProductName { get; set; }
public int CategoryId { get; set; }
public string CategoryName { get; set; }
}
public class MoniGridModel
{
public IEnumerable<MoniModel> MoniDetails { get; set; }
}
在我的控制器中,我正在尝试执行以下操作:
public ActionResult MoniDetails()
{
MoniModel mim = new MoniModel();
MoniGridModel migm = new MoniGridModel();
mim.CategoryId = 1;
mim.CategoryName = "a";
mim.ProductId = 1;
mim.ProductName = "b";
migm.MoniDetails.ToList().Add(mim);
return View(migm);
}
当migm.MoniDetails.ToList()。Add(mim);执行时,它会给出上述错误。我无法弄清楚为什么会这样。我正在为mim对象的每个成员赋值。下面是错误细节,但不确定这是否有帮助。
答案 0 :(得分:5)
您从未实例化MoniDetails
(创建null
时它的值为MoniGridModel
):
public ActionResult MoniDetails()
{
MoniModel mim = new MoniModel();
MoniGridModel migm = new MoniGridModel();
mim.CategoryId = 1;
mim.CategoryName = "a";
mim.ProductId = 1;
mim.ProductName = "b";
var details = new List<MoniModel>();
details.Add(mim);
migm.MoniDetails = details;
return View(migm);
}
正如@ David的回答指出的那样,尽管如此,最好让MoniGridModel
类处理IEnumerable<MoniModel>
。
除了他提供的选项之外,您还可以创建一个私有成员来支持IEnumerable<MoniModel>
并通过您当前拥有的getter公开它:
public class MoniGridModel
{
private List<MoniModel> moniDetails;
public MoniGridModel()
{
this.moniDetails = new List<MoniModel>();
}
public IEnumerable<MoniModel> MoniDetails
{
get { return this.moniDetails; }
}
public void AddDetail(moniDetail detail)
{
this.moniDetails.Add(detail);
}
}
然后从您的控制器操作中调用AddDetail
:
public ActionResult MoniDetails()
{
MoniModel mim = new MoniModel();
MoniGridModel migm = new MoniGridModel();
mim.CategoryId = 1;
mim.CategoryName = "a";
mim.ProductId = 1;
mim.ProductName = "b";
migm.AddDetail(mim);
return View(migm);
}
答案 1 :(得分:3)
MoniDetails
为null,因为它从未实例化过。这通常应该在构造对象时完成:
public class MoniGridModel
{
public IEnumerable<MoniModel> MoniDetails { get; set; }
public MoniGridModel()
{
MoniDetails = new List<MoniModel>();
}
}
这样消耗代码并不需要担心实例化它。维护对象状态的责任属于对象。
此外,这不符合您的想法:
migm.MoniDetails.ToList().Add(mim);
ToList()
返回IEnumerable<>
的枚举列表。但是你想要添加到可枚举的本身。鉴于此用途,您可能首先希望该属性为IList<>
,以便它可以支持Add()
操作:
public class MoniGridModel
{
public IList<MoniModel> MoniDetails { get; set; }
public MoniGridModel()
{
MoniDetails = new List<MoniModel>();
}
}
然后你可以添加它:
migm.MoniDetails.Add(mim);