2011-05-12 45 views
20

我很难过,因为我想格式化值并为css类添加html属性。Html.TextBoxFor格式或Html.EditorFor htmlAttributes?

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

如果我使用@Html.EditorFor(m => m.DateModified) - 格式化的作品,但如果我使用@Html.TextBox("DateModified", Model.DateModified, ...) 我不能添加HTML属性

- 我得到空引用异常时型号为空时,形式是在添加模式

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

+0

感谢这个问题,我是有一点差异的问题,但你在问题中给出的解释也帮助了我。不知道在EditoFor方法中,我无法提供html属性,并且模型绑定在我的情况下以糟糕的方式工作......再次感谢。 – 2012-02-23 10:28:04

回答

17

我结束了由我的日期选择器创建自定义编辑模板,所以解决这个:

共享/ EditorTemplates /约会时间。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 2011-08-23 20:40:45

+0

我为我自己的需求所做的唯一修改是添加'@ readonly =“readonly”'因为我使用jQuery datetime选择器 - 强制用户选择一个日期而不是担心他们输入某些愚蠢的东西。可能不适用于每个人或任何情况,但对我来说工作很好。 – itsmatt 2011-08-23 20:44:03

+0

虽然我确实注意到我这样做的副作用是它很难清除日期。我可能会删除那一点,因为它使事情变得复杂。 – itsmatt 2011-08-23 20:46:48

10

你可以...

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

谢谢你。我发现匿名类型“value”的第一个属性实际上应该以大写V(即“Value”)开始,否则它没有影响。 – 2012-01-12 09:32:22

+0

正如你所知,添加一个Value(带有大写字母V)会产生一个值和一个Value属性,当你用W3.org验证器检查你的标记时,它是无效的。 – Anton 2013-06-19 08:28:23

3

使用@ Html.EditorFor(M => m.DateModified),因为否则DisplayFormat属性不会有任何效果。

要添加更多属性(如CSS类),您必须为DateTime创建编辑器模板。 创建一个文件EditorTemplates/DateTime.cshtml具有以下内容:

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

请注意,文本框的值不直接设置与模式,而是与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"] 
    }) 
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)) 
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); 
相关问题