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

smn*_*bss 8 c# asp.net-mvc html5 asp.net-mvc-3

鉴于这是我的模特

public class ValidationModel
{
    #region Properties

    [Display(Prompt = "type a PostCode here")]
    public string PostCode { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

这是我的观点

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

}
Run Code Online (Sandbox Code Playgroud)

有没有办法让它渲染

<input data-val="true" id="PostCode" name="PostCode" placeholder="type a PostCode here" type="text" value="" />
Run Code Online (Sandbox Code Playgroud)

我无法使它工作,即使从文档http://bit.ly/jVpM8X我可以清楚地看到显示提示应该做的工作

Den*_*aub 15

@Html.TextBoxFor(m => m.PostCode, 
    new { placeholder = "type a postcode ..." } )
Run Code Online (Sandbox Code Playgroud)

  • 是的,我看到了,但我想在模型上使用DataAnnotaion属性(显示提示),我不想从视图中添加占位符属性 (4认同)

mat*_*mmo 9

我需要这个确切的功能,但我不想四处改变我所有的EditorFor东西(我有很多页面:)).

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

基于我使用的模型属性DisplayName,如下所示:

[DisplayName("Client Name")]
public string ClientName { get; set; }
Run Code Online (Sandbox Code Playgroud)

模板很简单:

@model string

@Html.TextBoxFor(m => m, new { @placeholder = ViewData.ModelMetadata.DisplayName })
Run Code Online (Sandbox Code Playgroud)

然后我的调用代码保持完全相同:

@Html.EditorFor(m => m.FirstName)
Run Code Online (Sandbox Code Playgroud)

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


Tom*_*son 2

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

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

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