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

Posted

技术标签:

【中文标题】从 ASP.NET Core 1.0 中的 ViewModel 元数据输入占位符【英文标题】:Input placeholder from ViewModel metadata in ASP.NET Core 1.0 【发布时间】:2016-03-17 08:59:30 【问题描述】:

是否可以设置内置的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 属性不再存在于ModelMetadata 中,即没有For.Metadata.Watermark 这样的东西。

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

所以我有两个问题。 有没有更聪明的方法来做到这一点? 从视图模型元数据中获取占位符是一种不好的做法,即我应该在 razor 文件中明确指定它吗?

【问题讨论】:

【参考方案1】:

我刚刚做了一个快速测试,如果我理解正确的话,使用默认的 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; 

查看sn-p:

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

结果:

【讨论】:

也适合我。谢谢!【参考方案2】:
Html.TextBoxFor(t => t.Tags, new  placeholder = Html.DisplayNameFor(m => m.Tags) )

【讨论】:

通常最好解释一个解决方案,而不是仅仅发布一些匿名代码行。你可以阅读How do I write a good answer,也可以阅读Explaining entirely code-based answers。 是的,你是对的。我认为这段代码是可以理解的。无需额外解释。尤其是这部分。 => Html.DisplayNameFor(m => m.Tags)

以上是关于从 ASP.NET Core 1.0 中的 ViewModel 元数据输入占位符的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core RC2 中的依赖注入失败

.NET Core 1.0ASP.NET Core 1.0和EF Core 1.0简介

在 asp.net core 中启用 CORS

如何在 ASP.NET Core 1.0 的 DI 中的 Startup 类中添加 IHttpContextAccessor?

ASP.NET Core 1.0 部署 HTTPS

ASP.NET Core 1.0 的 Kudu 部署脚本