首页 文章

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

提问于
浏览
10

是否可以设置内置 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 helper中的构建只是忽略 Prompt 属性值 .

拥有我自己的 asp-for 属性的自定义实现,例如 my-asp-for 是一个选项,最有可能的是,为了可维护性和重用其他逻辑,我最终会拥有它 . 但是 Watermark 中的 Watermark 属性不再存在,即没有 For.Metadata.Watermark 这样的东西 .

我可以在 asp-for 助手中看到 Prompt 值的唯一地方有点隐藏 .

enter image description here

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

2 回答

  • 0

    我刚刚做了一个快速测试,如果我理解正确的话,这对于我来说似乎是默认的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

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

相关问题