2013-05-15 45 views
5

我创建了一个局部视图(即使编辑器模板),我将一个子模型传递给该视图,但是,当我单击“提交”时,我总是从部分视图。除了子模型之外,我可以获取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” 总是空

回答

5

您应该添加子属性为你的动作额外参数:

[HttpPost] 
public ActionResult CatchPetContent(PetModel Model, Calendar Bob) 
{  
    ** snip ** 
} 

默认的ModelBinder不嵌套对象。但是,如果将其作为第二个参数包含它,它会找到这些值。

如果你想嵌套它们,你必须创建自己的模型绑定器。

以下问题也有类似的问题:List count empty when passing from view to model in ASP.Net MVC

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

我怀疑你的问题是,这样的嵌套对象为空你的编辑模板不会通过后回任何东西。在编辑器中模板行:

@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) 

这将让你真正输入一些数据上形成。一旦这个工作正常,您可以将文本框更改回删除,但您需要为选择列表提供值,只需创建新的空列表将不允许您选择任何值。而不是

+0

你是对的,但我已经将初始方法添加到每个下拉列表中,并且仍然为空。在我点击“提交”之前,我已经从下拉列表中选择了值,但是,一旦我点击了提交按钮,嵌套模型“日历”就会被指定为“null”。我已经在DefaultBuilder中调试了“SetProperty”方法,对象的值始终为空 – user2376512

+0

尝试使用Fiddler检查项目的值以查看表单值实际上是否被传回服务器。此外,HTML是什么样的一年,是模型绑定它应该有一个像DOB.Year这样的名称,如果它不,那么它不会被绑定。 –

+0

来自提琴手我可以找到下面的名称字符串=测试&SpeciesID = 2和BreedID = 7和DOB.Day = 23和DOB.Month = 05和DOB.Year = 2010 – user2376512

0

@Html.EditorFor(Model => x.DOB) 

尝试呈现局部视图

@Html.Partial("partialViewName", Model.DOB) 
+0

我已经试过了,它仍然有相同的问题。 – user2376512

0

我想在你的主视图你有一个错字,它看起来像你应该改变

@Html.EditorFor(Model => x.DOB) 

@Html.EditorFor(x => x.DOB)