【问题标题】:Return model from Partial View issue从局部视图问题返回模型
【发布时间】:2013-05-15 05:54:37
【问题描述】:

我创建了一个局部视图(即使是编辑器模板),我将一个子模型传递给视图,但是,当我单击“提交”时,我总是从局部视图中得到“null”。除了子模型,我可以获取主模型的属性值。

主模型

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”总是为空

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4


    【解决方案1】:

    您应该将子属性作为额外参数添加到您的操作中:

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

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

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

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

    【讨论】:

      【解决方案2】:

      默认模型绑定器将绑定嵌套对象,您无需为此场景创建自己的模型绑定器。

      见: 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)
      

      这将允许您在表单上实际输入一些数据。一旦这工作正常,您可以将文本框改回下拉列表,但您需要为选择列表提供值,同样,仅创建新的空列表将不允许您选择任何值。

      【讨论】:

      • 你是对的,但我已将初始方法添加到每个下拉列表中,但我仍然为空。在我点击“提交”之前,我已经从下拉列表中选择了值,但是,一旦我点击提交按钮,嵌套模型“日历”将被分配为“null”。我在DefaultBuilder中调试了“SetProperty”方法,object的值总是null
      • 尝试使用 Fiddler 检查项目的值,以查看表单值实际上是否被传回服务器。此外,HTML 的年份是什么样的,要被模型绑定,它应该有一个像 DOB.Year 这样的名称,如果没有,那么它不会被绑定。
      • 从提琴手我可以找到下面的字符串 name=test&SpeciesID=2&BreedID=7&DOB.Day=23&DOB.Month=05&DOB.Year=2010
      • 如果这是发送的内容,那么在控制器上绑定它应该没有问题。假设您的方法签名如下所示: public ActionResult actionName(PetModel viewModel)... viewModel 应该发送值。
      【解决方案3】:

      而不是

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

      尝试渲染局部视图

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

      【讨论】:

      • 我已经试过了,还是一样的问题。
      【解决方案4】:

      我认为您的主视图中有错字,看来您应该更改

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

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

      【讨论】:

        猜你喜欢
        • 2012-10-04
        • 1970-01-01
        • 2013-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多