值不能为空。参数名称:将对象添加到IEnumerable列表时的源

时间:2014-11-10 14:58:08

标签: c# .net asp.net-mvc-4 ienumerable

我正在构建一个简单的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对象的每个成员赋值。下面是错误细节,但不确定这是否有帮助。 enter image description here

2 个答案:

答案 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);