从ASP.NET Core 1.0中的ViewModel元数据输入占位符

时间:2016-03-17 08:59:31

标签: razor asp.net-core asp.net-core-mvc asp.net-core-1.0

是否可以设置内置的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值的唯一隐藏位置。

enter image description here

所以我有两个问题。 有更聪明的方法吗? 从viewmodel元数据中取出占位符是不好的做法,即我应该在剃刀文件中明确指定它?

2 个答案:

答案 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>

结果:

enter image description here

答案 1 :(得分:0)

Html.TextBoxFor(t => t.Tags, new { placeholder = Html.DisplayNameFor(m => m.Tags) })