Asp.net mvc 4 型号';的子集合始终为空

Asp.net mvc 4 型号';的子集合始终为空,asp.net-mvc-4,Asp.net Mvc 4,我似乎无法理解ASP.MVC4和代码优先绑定中的子集合。当涉及到子集合时,我总是得到一个错误,即模型对象为null。我甚至无法添加检查子集合是否为null,因为模型为null 我已经在控制器中验证过,如果我创建一个批处理对象并向其添加步骤,那么它将工作 我相信这很简单,但我想不出来 以下是我的物品: public class Batch { public virtual int Id { get; set; } public virtual string Title { get;

我似乎无法理解ASP.MVC4和代码优先绑定中的子集合。当涉及到子集合时,我总是得到一个错误,即模型对象为null。我甚至无法添加检查子集合是否为null,因为模型为null

我已经在控制器中验证过,如果我创建一个批处理对象并向其添加步骤,那么它将工作

我相信这很简单,但我想不出来

以下是我的物品:

public class Batch
{
    public virtual int Id { get; set; }
    public virtual string Title { get; set; }
    public virtual string Details { get; set; }
    public virtual ICollection<Step> Steps { get; set; }
}
public class Step
{
    public virtual int Id { get; set; }
    public virtual string Title { get; set; }
    public virtual int Days { get; set; }
    public virtual Batch Batch { get; set; }
}
以下是我的看法:

@model BC.Models.Batch

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Batch</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Title)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Title)
            @Html.ValidationMessageFor(model => model.Title)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Details)
        </div>
        <div class="editor-field">
            @Html.TextAreaFor(model => model.Details)
            @Html.ValidationMessageFor(model => model.Details)
        </div>

        <div>
            <h3>Steps</h3>
            // Here is where I get a error that model is null
            @if(model.Steps != null)
            {
                foreach(var item in model.Steps)
                {
                    @Html.EditorFor(model => item)
                }
            }
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}
@model BC.Models.Batch
@{
ViewBag.Title=“创建”;
}
创造
@使用(Html.BeginForm())
{
@Html.ValidationSummary(true)
批处理
@LabelFor(model=>model.Title)
@EditorFor(model=>model.Title)
@Html.ValidationMessageFor(model=>model.Title)
@LabelFor(model=>model.Details)
@Html.TextAreaFor(model=>model.Details)
@Html.ValidationMessageFor(model=>model.Details)
台阶
//这里是我得到一个模型为空的错误的地方
@如果(model.Steps!=null)
{
foreach(model.Steps中的var项)
{
@EditorFor(model=>item)
}
}

}
实例化模型并将其传递给视图

public ActionResult Create()
        {
            var model = new Batch();
            return View(model);
        }
这将解决视图中null模型上的NullReference异常

public ActionResult Create()
        {
            var model = new Batch();
            return View(model);
        }
但是,当您到达Psot操作时,步骤(批处理中的集合)可能为空。要解决此问题,请在构造函数中新建集合,如下所示:

public class Batch
    {
        public Batch()
        {
            Steps = new Collection<Step>();
        }
        public virtual int Id { get; set; }
        public virtual string Title { get; set; }
        public virtual string Details { get; set; }
        public virtual ICollection<Step> Steps { get; set; }
    }
公共类批处理
{
公共批处理()
{
步骤=新集合();
}
公共虚拟整数Id{get;set;}
公共虚拟字符串标题{get;set;}
公共虚拟字符串详细信息{get;set;}
公共虚拟ICollection步骤{get;set;}
}

我完全按照您在“创建”操作中编写的操作执行,它会抛出相同的编译器错误。编译器错误消息:CS0103:名称“model”在当前上下文中不存在OK,在我看来,我将小写模型更改为大写模型,它与传递新批的控制器操作中的更改一起工作。在响应的第二部分,构造函数中集合的设置不起作用。我收到以下错误:无法设置类型“Batch”-U E85AD838AF575CF76B82A41844C5D89E88CB62530C4C26D5F390441401D29”的属性“Steps”,因为集合已设置为EntityCollection。@Brian这是存储库/上下文中可能发生的实体框架错误,不是吗?这表明在属性上使用“virtual”关键字时创建的更改跟踪代理存在问题。这完全是另一个问题。为了清楚起见,这里是我修改原始代码的确切步骤。我从Id字段中删除了虚拟。我向视图传递了批处理的一个实例。我将视图中的@if(model.Steps!=null)和foreach(model.Steps中的var项)行更改为使用大写模型而不是小写模型。我仍然不明白为什么需要这样做。@Brian
Model
是System.Web.Mvc.ViewDataDictionary对象的属性。它是用于在视图中访问视图模型的属性
model
,如
@Html.EditorFor(model=>model.Title)
中所述,是lambda表达式中的任意变量,可以替换为
m
x
或其他任何变量。