Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 从局部视图问题返回模型_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

Asp.net mvc 从局部视图问题返回模型

Asp.net mvc 从局部视图问题返回模型,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,我已经创建了一个局部视图(即使是编辑器模板),我将一个子模型传递给视图,但是,当我单击“提交”时,我总是从局部视图获得“null”。我可以得到主模型的属性值,子模型除外 主要型号 public class PetModel { public string name {get; set;} public long SpeciesID {get; set;} public long BreedID {get; set;} public Calendar DOB {get; set;}

我已经创建了一个局部视图(即使是编辑器模板),我将一个子模型传递给视图,但是,当我单击“提交”时,我总是从局部视图获得“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;}
}
子模型

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.DOB”总是空的

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

[HttpPost]
public ActionResult CatchPetContent(PetModel Model, Calendar Bob)
{      
    ** snip **
}
默认的ModelBinder不会嵌套对象。但是,如果将其作为第二个参数包含,它会找到这些值

如果要嵌套它们,必须创建自己的modelbinder


以下问题也存在类似问题:

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

见: 诸如此类

我怀疑您的问题是编辑器模板没有通过post back返回任何内容,因此嵌套对象为空。编辑器模板中的行:

@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.EditorFor(Model => x.DOB)
尝试渲染局部视图

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

我认为在你的主要观点中,你有一个打字错误,看起来你应该改变

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


你是对的,但是我已经在每个下拉列表中添加了初始方法,结果仍然为空。在我单击“提交”之前,我已经从下拉列表中选择了值,但是,一旦我单击“提交”按钮,嵌套模型“日历”将被分配“null”。我已经在DefaultBuilder中调试了方法“SetProperty”,object的值始终为空。请尝试使用Fiddler检查项的值,以查看表单值是否实际传递回服务器。另外,HTML的年份是什么样子的,要绑定模型,它应该有一个像DOB.year这样的名称,如果没有,那么它就不会绑定。从Fiddler中,我可以找到name=test&SpeciesID=2&BreedID=7&DOB.Day=23&DOB.Month=05&DOB.year=2010下面的字符串。如果这是发送的,那么在控制器上绑定它应该没有问题。假设您的方法签名如下所示:公共ActionResult actionName(PetModel viewModel)。。。viewModel应该已经发送了值。我已经尝试过了,但仍然存在相同的问题。
@Html.EditorFor(Model => x.DOB)
@Html.EditorFor(x => x.DOB)