在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上写了一些内容,它的属性也是如此。
有谁知道我做错了什么?
答案 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..)]