【问题标题】:Html.TextBoxFor formatting or Html.EditorFor htmlAttributes?Html.TextBoxFor 格式化还是 Html.EditorFor htmlAttributes?
【发布时间】:2011-05-12 01:53:10
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 感谢您提出这个问题,我遇到了一点差异问题,但是您在您的问题中给出的解释也对我有所帮助。不知道在 EditoFor 方法中,我不能提供 html 属性,并且模型绑定在我的情况下工作得很糟糕......再次感谢。

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


【解决方案1】:

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

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)

【讨论】:

  • 不错。对我很有帮助 - 我对此感到沮丧。
  • 我为自己的需要所做的唯一修改是添加@readonly="readonly",因为我使用了 jQuery 日期时间选择器 - 强制用户选择一个日期,而不是担心他们输入一些愚蠢的东西。可能不适用于所有人或所有情况,但对我来说效果很好。
  • 虽然我确实注意到我这样做的副作用是很难清除日期。我可能会删除那一点,因为它会使事情复杂化。
  • 如果您想通过 EditorFor 调用传递任意属性,这将如何工作?我可以看到完成此操作的唯一方法是在 additionalViewData 参数中添加一些东西,这看起来很老套......
  • 但是this 一个为我工作得到我使用的这种dd/mm/yyyy 格式date = string.Format("{0}/{1}/{2}", Model.Value.Day, Model.Value.Month, Model.Value.Year);
【解决方案2】:

你可以...

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

【讨论】:

  • 谢谢你。我发现匿名类型“value”的第一个属性实际上应该以大写V开头(即“Value”),否则它没有影响。
  • 您知道,添加一个值(带有大写 V)会产生一个值和一个值属性,当您使用 W3.org 验证器检查您的标记时,该属性是无效的。
【解决方案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"]
    })

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-17
        • 1970-01-01
        • 2010-12-13
        • 1970-01-01
        • 2011-10-28
        • 2018-12-31
        • 2015-12-04
        相关资源
        最近更新 更多