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

时间:2011-05-12 01:53:10

标签: c# asp.net-mvc asp.net-mvc-3

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

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

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

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

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

5 个答案:

答案 0 :(得分:17)

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

共享/ 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)

答案 1 :(得分:10)

你可以......

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

答案 2 :(得分:3)

使用@ 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"]
    })

答案 3 :(得分:1)

为了防止对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))

答案 4 :(得分:0)

在文本框中显示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);