当前位置:编程学习 > 网站相关 >>

NopCommerce自定义DataAnnotation DisplayAttribute

System.dll(.Net Framework 4.0 )中已有DisplayNameAttribute 定义,被该标签注释的Model属性,在View中使用Html.LabelFor便可获取设置的字段名称。

 
namespace System.ComponentModel
{
    // 摘要:
    //     指定属性、事件或不采用任何参数的公共 void 方法的显示名称。
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Event)]
    public class DisplayNameAttribute : Attribute
    {
        // 摘要:
        //     指定 System.ComponentModel.DisplayNameAttribute 的默认值。此字段为只读。
        public static readonly DisplayNameAttribute Default;

        // 摘要:
        //     初始化 System.ComponentModel.DisplayNameAttribute 类的一个新实例。
        public DisplayNameAttribute();
        //
        // 摘要:
        //     使用显示名称初始化 System.ComponentModel.DisplayNameAttribute 类的新实例。
        //
        // 参数:
        //   displayName:
        //     显示名称。
        [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
        public DisplayNameAttribute(string displayName);

        // 摘要:
        //     获取属性、事件或不采用此特性中存储的任何参数的公共 void 方法的显示名称。
        //
        // 返回结果:
        //     显示名称。
        public virtual string DisplayName { get; }
        //
        // 摘要:
        //     获取或设置显示名称。
        //
        // 返回结果:
        //     显示名称。
        protected string DisplayNameValue { get; set; }

        // 摘要:
        //     Determines whether two System.ComponentModel.DisplayNameAttribute instances
        //     are equal.
        //
        // 参数:
        //   obj:
        //     要进行值的相等性测试的 System.ComponentModel.DisplayNameAttribute。
        //
        // 返回结果:
        //     如果给定对象的值等于当前对象的值,则为 true;否则为 false。
        public override bool Equals(object obj);
        //
        // 摘要:
        //     返回此实例的哈希代码。
        //
        // 返回结果:
        //     当前 System.ComponentModel.DisplayNameAttribute 的哈希代码。
        public override int GetHashCode();
        //
        // 摘要:
        //     确定此特性是否为默认特性。
        //
        // 返回结果:
        //     如果此特性是此特性类的默认值,则为 true;否则为 false。
        public override bool IsDefaultAttribute();
    }
}
 

Model定义如下

public class Student{

 [DisplayName("姓名")] 
 public string Name{get;set;}

 [DisplayName("年龄")]
 public int Age {get;set;}
}

 

mvc view 页面

@Model Student

@Html.LabelFor(model=>model.Name)
@Html.EdditFor(model=>model.Name)
 

@Html.LabelFor(model=>model.Name) 会render为“姓名”

 

这种方式显然比直接在view层上hard-code要优化,但是却在Model层上Hardcode了。

 

一种好的解决方式是使用resource文件,或者将string存储在database中。

然后重写 DisplayNameAttribute

 

如下

 

public class LocalizationDisplayName: DisplayNameAttribute
{
 private string ResourceName = string.Empty;

 public string LocalizationDisplayName(string resourceKey)
 {
  this.ResourceName = resourceKey; 
 }
 
 public override string DisplayName
 {
  get {
   //get localitation string from resource file
   // or database via resource name.
  }
 }
}

 


摘自 philzhou

补充:Web开发 , 其他 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,