提交表单时,模型属性为null

时间:2014-07-30 11:48:06

标签: c# asp.net-mvc

在ASP.NET MVC 5项目中,我有以下模型:

public class ScheduleIndexModel {

  public IPageList<DataModel> Data { get; set; }
  public FormModel Form { get; set; }

  public class DataModel {
    public Int32 Id { get; set; }
    public String[] Attendees { get; set; }
    public String Location { get; set; }
    public DateTime Date { get; set; }
  } // DataModel

  public class FormModel {      
    public String Location { get; set; }
    public String Date { get; set; }      
  } // FormModel

}

视图如下:

<form action="@Url.Action(MVC.Schedule.Index())" method="post">
  @Html.LabelFor(x => x.Form.Date, "Date")
  @Html.TextBoxFor(x => x.Form.Date)
  @Html.LabelFor(x => x.Form.Location, "Location")
  @Html.TextBoxFor(x => x.Form.Location)
  @Html.SubmitButton("Filter", "Index", new { @class = "submit" })
  @Html.AntiForgeryToken()
</form>

然后HTTPPost控制器操作如下:

[HttpPost]
public virtual ActionResult Index(ScheduleIndexModel.FormModel model, Int32 p = 1) {
  return View();
} // Index

当我提交表单时,模型不是null,但即使我在TextBox上写了一些内容,它的属性也是如此。

有谁知道我做错了什么?

2 个答案:

答案 0 :(得分:1)

您可能需要使用绑定前缀,因为您的viewmodel是嵌套的。这样的事情可能有用:

public virtual ActionResult Index([Bind(Prefix = "Form")] FormModel model) 

答案 1 :(得分:1)

你的html助手(例如@Html.TextBoxFor(x => x.Form.Date)将生成像这样的HTML

<input name="Form.Date" .../>

但是因为你的post方法接受FormModel类型的参数,它无法匹配(FormModel只有属性Date,而不是属性Form,其属性为Date })。

您可以将操作方法​​更改为

public virtual ActionResult Index(ScheduleIndexModel model,... 
{
  FormModel form = model.Form; // get the FormModel

或使用Big Daddy建议的[Bind(Prefix..)]