Asp.net mvc 4 型号';的子集合始终为空
我似乎无法理解ASP.MVC4和代码优先绑定中的子集合。当涉及到子集合时,我总是得到一个错误,即模型对象为null。我甚至无法添加检查子集合是否为null,因为模型为null 我已经在控制器中验证过,如果我创建一个批处理对象并向其添加步骤,那么它将工作 我相信这很简单,但我想不出来 以下是我的物品: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;
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项)行更改为使用大写模型而不是小写模型。我仍然不明白为什么需要这样做。@BrianModel
是System.Web.Mvc.ViewDataDictionary对象的属性。它是用于在视图中访问视图模型的属性model
,如@Html.EditorFor(model=>model.Title)
中所述,是lambda表达式中的任意变量,可以替换为m
或x
或其他任何变量。