自定义DisplayName

时间:2014-07-21 13:23:24

标签: c# asp.net-mvc attributes asp.net-mvc-5 data-annotations

目前我正在尝试设置动态DisplayName属性,但我找不到如何获取属性中当前属性的信息的方法。

这就是我想要实现的目标:

期望的结果

Custom Display Name in Label and Required error message

我的属性

public class DisplayNameFromPropertyAttribute : DisplayNameAttribute
{
    public DisplayNameFromPropertyAttribute(string propertyName) 
        : base(GetDisplayName(propertyName))
    {
    }

    private string GetDisplayBame(string propertyName)
    {
        // Get the value from the given property
    }
}

我的模特

我正在尝试将MyDisplayName中的值读入我的自定义DisplayNameFromProperty属性

public class MyAwesomeModel
{
    public string MyDisplayName { get; set; }

    [Required]
    [DisplayNameFromProperty("MyDisplayName")]
    public string MyValue { get; set; }
}

我的页面

@Html.LabelFor(model => model.MyValue)
@Html.TextBoxFor(model => model.MyValue)
@Html.ValidationMessageFor(model => model.MyValue)

问题

  • 目前我在互联网上找不到任何相同的参考资料。有人可以帮帮我吗?
  • 如果不可能:有哪些替代方法可以达到相同的效果?
    • ComponentModel.DataAnnotations验证属性应使用我的自定义显示名称
    • @Html.LabelFor(model => model.MyValue)应使用我的自定义显示名称

1 个答案:

答案 0 :(得分:0)

您可以创建一个cusom HTML扩展方法,让您可以执行@ Html.DictionaryLabelFor(x => x.Property)并从字典中提取

    public static IHtmlString DictionaryLabelFor<TModel, TValue>(
        this HtmlHelper<TModel> html,
        Expression<Func<TModel, TValue>> expression, string text = null, string prefix = null)
    {
        var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
        var displayName = metadata.DisplayName;

        if (string.IsNullOrWhiteSpace(text))
        {
            // Your code to get the label via reflection
            // of the object
            string labelText = ""; 

            return html.Label(prefix + metadata.PropertyName, labelText);
        }
        else
        {
            return html.Label(prefix + metadata.PropertyName, text);
        }
    }

覆盖这个属性上的属性,唯一缺少的是我编写时不需要的自定义html属性

验证错误消息略有不同,您应该始终为这些字段编写自定义错误,以便您可以在resx中依赖它们,查看模型状态(前缀+键)以获取错误,然后获取每个案例的翻译价值。

您最好避免覆盖标准HTML调用,因为您将在其他地方不需要进行多余调用。

当你有这个工作并理解时,错误消息部分非常容易自己写,取决于你想如何对错误进行格式化。我不是在写它,因为它基本上是为你做的一切,如果你不理解它是如何工作的,那么在编写更多扩展时你将是SOL