【问题标题】:Value cannot be null. Parameter name: source when Adding object to IEnumerable list值不能为空。参数名称:将对象添加到 IEnumerable 列表时的源
【发布时间】:2014-11-10 14:58:07
【问题描述】:

我正在构建一个简单的 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 对象的每个成员赋值。以下是错误详细信息,但不确定是否会有所帮助。

【问题讨论】:

  • 您是否为 MoniDetails 分配了任何内容?
  • migm.MoniDetails.ToList().Add(mim); 完全没有任何作用。您从ToList() 获得的列表是一个新实例,它会立即被丢弃。

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


【解决方案1】:

您从未实例化过MoniDetails(当您创建MoniGridModel 时,它的值是null):

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&lt;MoniModel&gt;

除了他提供的选项之外,您还可以创建一个支持 IEnumerable&lt;MoniModel&gt; 的私有成员,并通过您当前拥有的 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);
}

【讨论】:

  • 知道了。我应该知道这一点。谢谢。
【解决方案2】:

MoniDetails 为 null,因为它从未被实例化。这通常应该在构造对象时完成:

public class MoniGridModel
{
    public IEnumerable<MoniModel> MoniDetails { get; set; }

    public MoniGridModel()
    {
        MoniDetails = new List<MoniModel>();
    }
}

这样使用代码就不必担心实例化它。维护对象状态的责任属于封装在对象内部。

此外,这并不像您认为的那样:

migm.MoniDetails.ToList().Add(mim);

ToList() 返回IEnumerable&lt;&gt; 的枚举列表。但是您想添加到可枚举本身。鉴于这种用途,您可能首先希望该属性为IList&lt;&gt;,以便它可以支持Add() 操作:

public class MoniGridModel
{
    public IList<MoniModel> MoniDetails { get; set; }

    public MoniGridModel()
    {
        MoniDetails = new List<MoniModel>();
    }
}

然后你可以添加它:

migm.MoniDetails.Add(mim);

【讨论】:

  • 解释得很好。谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-15
相关资源
最近更新 更多