EditorFor如何在表单元素上设置ID和Name html属性

我有几层嵌套自定义用户控件:

RegisterUser.aspx

<%@ .... Inherit="System.Web.Mvc.ViewPage" ...  m.Details) %> ... 

UserDetails.ascx

  <%@ .... Inherit="System.Web.Mvc.ViewUserControl" ...  m.BirthDate) %>  ... 

我在Shared / EditorTemplates中声明了DateTime.ascx

  <%@ .... Inherit="System.Web.Mvc.ViewUserControl" ...  ... 

问题是如何设置输入id属性? 我知道EditorFor为默认类型提供了一些魔力。 例如,如果DateTime的类型为string,则EditorFor会将输入类型的id设置为“Details_BirthDate”,将name属性设置为“Details.BirthDate”。 我想知道它是如何完成的? 因为我想将它用于我的特殊自定义类型。

您将使用多少级别的编辑器模板? 我真的认为最后一个是多余的,你可以使用:

 <%= Html.TextBoxFor(m => m.BirthDate) %> 

顺便说一下MVCContrib很棒。 它有类似的东西:

 <%: Html.IdFor(x => x.BirthDate) %> 

和:

 <%: Html.NameFor(x => x.BirthDate) %> 

这在某些情况下非常有用。


更新:

始终使用强类型编辑器模板:

 <%@ .... Inherit="System.Web.Mvc.ViewUserControl" <%: Html.TextBoxFor(x => x) %> 

使用以下两种方法找到解决方案:

 <%= Html.ViewData.TemplateInfo.GetFullHtmlFieldId("BirthDate") %> <%= Html.ViewData.TemplateInfo.GetFullHtmlFieldName("BirthDate") %> 

我想你正在寻找ViewData.TemplateInfo.HtmlFieldPrefix。 例:

  

如果需要指定字段,可以使用GetFullHtmlFieldId,但如果在显示或编辑模板中使用它,则可以使用HtmlFieldPrefix。

更多信息在这个SO问题: 在EditorTemplate中渲染字段名称(通过EditorFor()呈现)