Asp.net mvc Post进入控制器无法正常工作

Asp.net mvc Post进入控制器无法正常工作,asp.net-mvc,asp.net-mvc-4,model-binding,Asp.net Mvc,Asp.net Mvc 4,Model Binding,我有一个嵌套类的实体模型。FSRHire是父母,员工是子女: class FSRHire { ... public virtual Employee Employee ... } class Employee { ... public string LastName {get;set;} public DateTime DOB {get;set;} ... } 视图: @LabelFor(model=>model.Employee.La

我有一个嵌套类的实体模型。FSRHire是父母,员工是子女:

class FSRHire {
    ...
    public virtual Employee Employee
    ...
}
class Employee {
    ...
    public string LastName {get;set;}
    public DateTime DOB {get;set;}
    ...
}
视图:


@LabelFor(model=>model.Employee.LastName)
@EditorFor(model=>model.Employee.LastName)
@Html.ValidationMessageFor(model=>model.Employee.LastName)
@LabelFor(model=>model.Employee.DOB)
@TextBox(Html.IdFor(model=>model.Employee.DOB).ToString(),model.Employee.DOB.HasValue?model.Employee.DOB.Value.ToString(“d”):“”,new{@class=“date”})
@Html.ValidationMessageFor(model=>model.Employee.DOB)
控制器中的post无效。以下是请求中的数据:

…Employee.LastName=Worker&Employee\u DOB=01%2F01%2F1970&

模型活页夹很好地记住了这个名字。Employee.DOB为空


这可能是由DOB字段中的下划线引起的。(雇员)。我想知道为什么会这样,以及我如何修复它。

它应该是以下格式:

...Employee.LastName=Worker&Employee.DOB=01%2F01%2F1970& ...
更改自:

Employee_DOB=01%2F01%2F1970&
//      ^

关于这一观点:

@Html.TextBox(Html.IdFor(model => model.Employee.DOB).ToString(), Model.Employee.DOB.HasValue ? Model.Employee.DOB.Value.ToString("d") : "", new { @class = "date" })
在Web.mvcdll中没有
IdFor
方法,可能是您自己编写的,或者使用了一些库,总之它工作不正常

将视图中的线更改为如下所示:

 @Html.TextBoxFor(model => model.Employee.DOB, Model.Employee.DOB.HasValue ? Model.Employee.DOB.Value.ToString("d") : "", new { @class = "date" })

它位于MVC4.0中的System.Web.Mvc.Html中。这是可以肯定的。我正在研究这项技术的来源。我为它添加了标签。无论如何,如果您没有更改HTML助手生成标记的方式,我建议您为MVC团队打开一个bug。您应该知道ASP.Net-MVC4仍处于测试阶段…:(我实际上更改了标记以使用jQueryUIDatePicker。(基于不正确的博客条目。)我将视图中必须更改的行添加到您的答案中。
@Html.TextBox(Html.IdFor(model => model.Employee.DOB).ToString(), Model.Employee.DOB.HasValue ? Model.Employee.DOB.Value.ToString("d") : "", new { @class = "date" })
 @Html.TextBoxFor(model => model.Employee.DOB, Model.Employee.DOB.HasValue ? Model.Employee.DOB.Value.ToString("d") : "", new { @class = "date" })