正如 Darin Dimitrov 的回答中的 smnbss cmets,Prompt 正是为此目的而存在,因此无需创建自定义属性。从文档中:
获取或设置一个将被使用的值
为提示设置水印
用户界面。
要使用它,只需像这样装饰视图模型的属性:
[Display(Prompt = "numbers only")]
public int Age { get; set; }
此文本随后会方便地放置在ModelMetadata.Watermark 中。开箱即用,MVC 3 中的默认模板忽略了Watermark 属性,但使其工作非常简单。你需要做的就是调整默认的字符串模板,告诉 MVC 如何渲染它。只需像 Darin 那样编辑 String.cshtml,只不过不是从 ModelMetadata.AdditionalValues 获取水印,而是直接从 ModelMetadata.Watermark 获取水印:
~/Views/Shared/EditorTemplates/String.cshtml:
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { @class = "text-box single-line", placeholder = ViewData.ModelMetadata.Watermark })
就是这样。
如您所见,使一切正常运行的关键是 placeholder = ViewData.ModelMetadata.Watermark 位。
如果您还想为多行文本框 (textareas) 启用水印,您对 MultilineText.cshtml 执行相同操作:
~/Views/Shared/EditorTemplates/MultilineText.cshtml:
@Html.TextArea("", ViewData.TemplateInfo.FormattedModelValue.ToString(), 0, 0, new { @class = "text-box multi-line", placeholder = ViewData.ModelMetadata.Watermark })