我创建了一个局部视图(即使是编辑器模板),我将一个子模型传递给视图,但是,当我点击“提交”时,我总是从局部视图中获得“null”。除了子模型1之外,我可以获得Main模型的属性值。
主要模式
public class PetModel
{
public string name {get; set;}
public long SpeciesID {get; set;}
public long BreedID {get; set;}
public Calendar DOB {get; set;}
}
子模型
public class Calendar
{
public string Year{get; set;}
public string Month{get; set;}
public string Day{get; set;}
}
主视图
@model Application.Models.PetModel
@using (Html.BeginForm("CatchPetContent", "Quote",Model))
{
@Html.TextBoxFor(x => x.Name)
@Html.DropDownListFor(x=>x.SpeciesID,new List<SelectListItem>(),"select")
@Html.DropDownListFor(x=>x.BreedID,new List<SelectListItem>(),"select")
@Html.EditorFor(Model => x.DOB)
<input type="submit" value="submit" />
}
编辑模板
@model Application.Models.Calendar
@Html.DropDownListFor(Model => Model.Day, new List<SelectListItem>())
@Html.DropDownListFor(Model => Model.Month,new List<SelectListItem>())
@Html.DropDownListFor(Model => Model.Year, new List<SelectListItem>())
“CatchPetContent”操作
[HttpPost]
public ActionResult CatchPetContent(PetModel Model)
{
PetModel pet = new PetModel();
pet.Name = Model.Name;
pet.SpeciesID = Model.SpeciesID;
pet.BreedID = Model.BreedID;
pet.DOB = Model.DOB;// always null
RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary();
redirectTargetDictionary.Add("Controller", "Home");
redirectTargetDictionary.Add("Action", "Index");
return new RedirectToRouteResult(new RouteValueDictionary(redirectTargetDictionary));
}
当我调试它时,“Model.DOB”始终为null
答案 0 :(得分:5)
您应该将子属性添加为操作的额外参数:
[HttpPost]
public ActionResult CatchPetContent(PetModel Model, Calendar Bob)
{
** snip **
}
默认的ModelBinder不会嵌套对象。但是,如果将其作为第二个参数包含在内,它会找到值。
如果你想嵌套它们,你必须创建自己的模型绑定器。
以下问题也存在类似问题:List count empty when passing from view to model in ASP.Net MVC
答案 1 :(得分:0)
默认模型绑定器将绑定嵌套对象,您无需为此方案创建自己的模型绑定器。
请参阅: http://lostechies.com/jimmybogard/2011/09/07/building-forms-for-deep-view-model-graphs-in-asp-net-mvc/ 并在SO DefaultModelBinder not binding nested model
我怀疑你的问题是你的编辑器模板没有通过帖子返回任何内容,所以嵌套对象为null。编辑器模板中的行:
@Html.DropDownListFor(Model => Model.Day, new List<SelectListItem>())
@Html.DropDownListFor(Model => Model.Month,new List<SelectListItem>())
@Html.DropDownListFor(Model => Model.Year, new List<SelectListItem>())
将为您提供三个具有空下拉菜单的控件,您将无法从这些下拉列表中选择任何内容,因为您没有为它们提供任何值。如果没有值,那么它们不会通过电线发送,也不能被模型绑定。要开始将编辑器模板更改为:
@Html.TextBoxFor(Model => Model.Day)
@Html.TextBoxFor(Model => Model.Month)
@Html.TextBoxFor(Model => Model.Year)
这将允许您实际将一些数据输入到表单中。一旦这个工作,你可以将文本框改回到下拉菜单,但你需要为选择列表提供值,再次,只是创建新的空列表将不允许你选择任何值。
答案 2 :(得分:0)
而不是
@Html.EditorFor(Model => x.DOB)
尝试渲染局部视图
@Html.Partial("partialViewName", Model.DOB)
答案 3 :(得分:0)
我认为在你的主视图中你有一个错字,看起来你应该改变
@Html.EditorFor(Model => x.DOB)
到
@Html.EditorFor(x => x.DOB)