#MVC3 有没有办法使用 DataAnnotations 属性添加 HTML5 占位符属性

本文关键字:属性 添加 HTML5 占位符 DataAnnotations 有没有 #MVC3 | 更新日期: 2023-09-27 17:59:24

鉴于这是我的模型

public class ValidationModel
{
    #region Properties
    [Display(Prompt = "type a PostCode here")]
    public string PostCode { get; set; }
}

这是我的观点

@using (Html.BeginForm())
{
    @Html.LabelFor(m => m.PostCode)
    @Html.TextBoxFor(m => m.PostCode)
}

有没有办法让它渲染

<input data-val="true" id="PostCode" name="PostCode" placeholder="type a PostCode here" type="text" value="" />

即使从文档中 http://bit.ly/jVpM8X 我可以清楚地看到显示提示应该完成这项工作,我也无法使其工作

#MVC3 有没有办法使用 DataAnnotations 属性添加 HTML5 占位符属性

@Html.TextBoxFor(m => m.PostCode, 
    new { placeholder = "type a postcode ..." } )

我需要这个确切的功能,但我不想四处走动,把我所有的EditorFor都改成不同的东西(我有很多页面:)(。

为了实现这一点,我只是为String创建了一个EditorTemplate(如果需要,你可以为其他类型的类型执行此操作(。

根据我的模型属性,我DisplayName使用,如下所示:

[DisplayName("Client Name")]
public string ClientName { get; set; }

模板很简单:

@model string
@Html.TextBoxFor(m => m, new { @placeholder = ViewData.ModelMetadata.DisplayName })

然后我的调用代码保持不变:

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

此外,您可以使用该确切代码为非HTML5浏览器执行此操作。我所做的只是为这个伟大的jQuery占位符插件添加一个脚本引用,我所有的占位符甚至可以在IE6(!!!(中工作。

> 我不能 100% 确定,但看起来水印已经进入元数据代码(有一种明确的标准方法来定义与属性一起使用的字符串(但不是视图代码,因为还没有一种普遍支持的方式来处理客户端的水印。

如果手动添加属性不起作用,最好的选择可能是创建一个新的 HTML 帮助程序 Html5TextBoxFor 并使用它而不是标准的 TextBoxFor。

在该帮助程序中,您可以使用 ModelMetadata.FromLambdaExpression 获取提示文本,然后使用从元数据生成的自定义 html 属性对象调用 TextBoxFor。

可以通过使用 new {} 关键字在@html.control中分配属性的值,然后通过@以符号开头定义属性,将 razor 视图中的任何 html 属性添加到 HTML 帮助程序中,如果您在 razor 中使用表示 html 属性的保留关键字,例如您需要在该单词之前添加@ class, 与 Razor 引擎处理 HTML DOM 元素的方式相同,例如:

 @Html.TextBoxFor(x => x.Name, new { @class = "form-control", placeholder = "Your Name" } )

您还可以创建自己的 HtmlHelper 扩展方法来执行此操作,如本文中所述:http://mvcdiary.com/2012/09/28/create-a-custom-htmlhelper-textboxfor-to-display-label-text-as-placeholder-integrated-with-twitter-bootstrap/

虽然你可能从来没有真正这样做过,但作为概念证明,你可以这样做:

型:

[Required, Display(Description = "Type your note here...")]
public string Note { get; set; }

视图:

@Html.TextAreaFor(x => x.Note, new { placeholder = ViewData.ModelMetadata
    .Properties.FirstOrDefault(x => x.PropertyName == "Note")?.Description })