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

20

我有些困惑,因为我想格式化值并添加用于CSS类的HTML属性。

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

如果我使用@Html.EditorFor(m => m.DateModified) - 格式化有效,但无法添加HTML属性。

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

最佳方法是什么?


谢谢你的问题,我之前遇到了一些小问题,但是你在问题中提供的解释也帮助了我。我不知道在EditorFor方法中不能使用HTML属性,并且在我的情况下模型绑定的效果很差...再次感谢。 - Anand
5个回答

17
我最终通过创建一个自定义的编辑器模板来解决这个问题,具体操作如下:
Shared/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)

2
很好。对我非常有帮助——我对此感到沮丧。 - itsmatt
我为了自己的需求所做的唯一修改是添加了 @readonly="readonly",因为我使用了 jQuery 日期时间选择器 - 强制用户选择一个日期,而不必担心他们输入一些奇怪的东西。这可能并不适用于每个人或每种情况,但对我来说效果还不错。 - itsmatt
虽然我注意到我的这样做的副作用是它使清除日期变得困难。 我可能会删除那一部分,因为它会让事情变得复杂。 - itsmatt
如果您想通过EditorFor调用传递任意属性,该怎么做呢?我唯一能想到的方法是向additionalViewData参数添加内容,但这似乎有些hacky... - DMac the Destroyer
但是这个对我有用,以获取dd/mm/yyyy格式,我使用了date = string.Format("{0}/{1}/{2}", Model.Value.Day, Model.Value.Month, Model.Value.Year); - Shaiju T

10

你可以...

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

7
谢谢您。我发现匿名类型“value”的第一个属性实际上应该以大写字母V开头(即“Value”),否则它没有任何影响。 - Tahir Hassan
只是让你知道,添加一个大写字母V的值会产生一个值和一个Value属性,当你使用W3.org验证器检查你的标记时是无效的。 - Anton

3

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

要添加其他属性,如CSS类,您需要为DateTime创建一个编辑器模板。 创建一个名为EditorTemplates/DateTime.cshtml的文件,并使用以下内容:

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

请注意,文本框的值不是直接使用模型设置的,而是使用TemplateInfo.FormattedModelValue设置的,因为该值将根据DisplayFormat属性进行格式化,而模型则不会。(这让我花费了相当长的时间来意识到。:))
在简单情况下,这可能已经足够了,例如如果所有日期编辑器的CSS类可以相同。
如果您想参数化属性,也可以这样做,将属性值参数传递给EditorFor。
@Html.EditorFor(m => m.DateModified, new { @class = "someClass" })

然而,这个参数不会自动地作为属性委派给HTML控件,而是需要在模板中显式地“处理”它。根据我的经验,您可以在模板的ViewData中访问此参数值,因此参数化模板如下:

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

1
为了避免在EditorFor中硬编码列出的键值对,将ViewData对象转换为字典,并将该字典对象传递给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))

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接