是否可以设置内置的asp-for
代码帮助器,以从视图模型中的[Display(Prompt = "This is the placeholder")]
属性中获取输入占位符。
[Display(Name="Name", Prompt = "This is the placeholder")]
public string Name { get; set; }
在MVC 5中,我可以通过在编辑器模板中添加额外的逻辑并检查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 Core 1.0中我想开始使用新的标记帮助方法。默认情况下,asp-for
帮助中的构建只会忽略Prompt
属性值。
拥有我自己的asp-for
属性的自定义实现,例如my-asp-for
是一个选项,最有可能的是,为了可维护性和重用其他逻辑,我最终会拥有它。
但是Watermark
中不再存在ModelMetadata
属性,即没有For.Metadata.Watermark
这样的内容。
我可以在Prompt
帮助器中看到asp-for
值的唯一隐藏位置。
所以我有两个问题。 有更聪明的方法吗? 从viewmodel元数据中取出占位符是不好的做法,即我应该在剃刀文件中明确指定它?
答案 0 :(得分:29)
我刚刚做了一个快速测试,如果我理解正确的话,对于我来说,使用默认的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>
结果:
答案 1 :(得分:0)
Html.TextBoxFor(t => t.Tags, new { placeholder = Html.DisplayNameFor(m => m.Tags) })