Html.TextBoxFor格式化还是Html.EditorFor htmlAttributes?

我有点难过,因为我想格式化值并为css类添加一个html属性。

如果我使用@Html.TextBoxFor(m => m.DateModified) – 我可以添加html属性,但格式不能通过成员上的DisplayFormat属性工作。

如果我使用@Html.EditorFor(m => m.DateModified) – 格式化工作但我无法添加html属性

如果我使用@Html.TextBox("DateModified", Model.DateModified, ...) – 当表单处于添加模式时,当Model为null时,我得到空引用exception

实现这一目标的最佳方法是什么?

我最终通过为我的日期选择器创建自定义编辑器模板来解决这个问题:

共享/ EditorTemplates / DateTime.cshtml

  @model System.DateTime? @Html.TextBox("", Model.HasValue ? Model.Value.ToString("dd/MM/yyyy") : string.Empty, new { @class = "date-picker" }) 

然后在我的原始页面继续使用

 @Html.EditorFor(m => m.DateModified) 

你可以…

 @Html.TextBoxFor(m => m.DateModified, new { Value = Model.DateModified.ToString("MM-dd-yyyy"), @class = "superCoolClassName"}) 

使用@ Html.EditorFor(m => m.DateModified),否则DisplayFormat属性将无效。

要添加CSS类等其他属性,必须为DateTime创建编辑器模板。 使用以下内容创建文件EditorTemplates / DateTime.cshtml:

 @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { @class="date" }) 

请注意,TextBox的值不是直接使用Model设置的,而是使用TemplateInfo.FormattedModelValue设置的 ,因为该值将根据DisplayFormat属性进行格式化,而Model不会。 (这花了我很长时间才意识到。:))

在简单的情况下,这可能就足够了,例如,如果所有日期编辑器的CSS类都相同。

如果要对属性进行参数化,也可以将属性值参数传递给EditorFor。

 @Html.EditorFor(m => m.DateModified, new { @class = "someClass" }) 

但是,此参数不会作为属性自动委派给HTML控件,但您必须明确地在模板中“处理”它。 根据我的经验,您可以在模板中的ViewData中访问此参数值,因此参数化模板如下所示:

 @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { @class=ViewData["class"] }) 

要防止对EditorFor中列出的键/值对进行硬编码,请将ViewData对象转换为Dictionary并将该字典对象传递给TextBox。

例如

  @Html.EditorFor(m => m.DateModified, "Template", new { @class = "someClass", size=8 , htmlTag="custom" }) 

在你的模板中

  @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, ViewData.ToDictionary(c=>c.Key,c=>.Value)) 

要在文本框中显示json日期(cshtml):

 var d1 = ui.item.IssueDate; var d = new Date(parseInt(d1.slice(6, -2))); var Issdate = ("0" + (d.getMonth() + 1)).slice(-2) + '/' + ("0" + d.getDate()).slice(-2) + '/' + d.getFullYear().toString(); $('#IssueDate').val(Issdate);