可以将内置的asp-for标记助手设置为从视图模型中的[Display(Prompt = "This is the placeholder")]属性获取输入占位符。
[Display(Name="Name", Prompt = "This is the placeholder")]
public string Name { get; set; }在MVC5中,我可以通过在编辑器模板中添加额外的逻辑并检查ViewData.ModelMetadata.Watermark属性来实现这一点。例如:
@model string
@{
Dictionary<string, object> htmlAttributes = new Dictionary<string, object>();
htmlAttributes.Add("class", "form-control");
if (!string.IsNullOrWhiteSpace(ViewData.ModelMetadata.Watermark))
{
htmlAttributes.Add("placeholder", ViewData.ModelMetadata.Watermark);
}
}
@Html.Label("")
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, htmlAttributes)
@Html.ValidationMessage("", "", new { @class = "text-danger" })但现在在ASP.NET Core1.0中,我想开始使用新的标记助手方法。默认情况下,build in asp-for帮助器简单地忽略Prompt属性值。
拥有我自己的asp-for属性的自定义实现,例如,my-asp-for是一个选项,很可能我最终会为了可维护性和重用额外的逻辑而使用它。但是Watermark属性不再出现在ModelMetadata中,也就是说,不存在For.Metadata.Watermark这样的东西。
在asp-for辅助对象中,我唯一能看到Prompt值的地方是有些隐藏的。

所以我有两个问题。有没有更聪明的方法呢?从视图模型元数据中获取占位符是不是一种糟糕的做法,也就是说,我应该在剃刀文件中显式地指定它?
发布于 2016-06-18 00:44:52
我刚刚做了一个快速测试,如果我没理解错的话,这对我来说似乎是开箱即用的默认VS模板:
型号:
public class LoginViewModel
{
[Required]
[EmailAddress]
[Display(Name = "Email", Prompt = "example@example.org")]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}查看代码片段:
<div class="form-group">
<label asp-for="Email" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="Email" class="form-control" />
<span asp-validation-for="Email" class="text-danger"></span>
</div>
</div>结果:

发布于 2017-10-16 22:11:15
Html.TextBoxFor(t => t.Tags, new { placeholder = Html.DisplayNameFor(m => m.Tags) })https://stackoverflow.com/questions/36055755
复制相似问题