2011-06-16 70 views
8

鉴于这是我的模型有没有使用DataAnnotations属性添加HTML5占位符属性的方法?

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我可以清楚地看到Display Prompt应该做这个工作

+0

请访问我们的http://aspnet.codeplex.com/wikipage?title=ASP.NET%20MVC%204%20RoadMap网站以申请此项。让我知道如果你这样做。 – RickAndMSFT 2012-03-09 18:48:49

回答

2

我不能100%确定,但它看起来像水印已成为元数据代码(有一个明确的标准方式来定义一个字符串与财产)但不是视图代码目前还不是在客户端处理水印的普遍支持方式。

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

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

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

是的,我看到了,但我想在模型上使用DataAnnotaion属性(Display Prompt),我不想从视图中添加占位符属性 – smnbss 2011-06-16 16:31:08

9

我需要这个确切的功能,但我不想去走一走,改变我所有的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浏览器中使用该工作,即确切代码。我所做的只是添加一个脚本引用到this great jQuery placeholder plugin和我的所有占位符甚至工作在IE6(!!!!)。

0

虽然你可能没有以往任何时候都真正做到这一点,作为一个概念证明你可以这样做:

型号:

[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 }) 
1

任何HTML在剃刀属性通过使用new {}关键字t在@html.control中指定属性值,可以将视图添加到HTML帮助程序母鸡用@符号开始,如果您使用的剃刀保留关键字,表示喜欢class你需要的字前加@,例如同样的方式剃刀引擎将HTML DOM元素HTML属性定义属性:

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