有没有办法复用数据标注?有没有一种方法可以在用作ASP.NetMVC4视图中的模型的类中实现数据域的概念(在属性级别)?考虑以下代码:publicclassLoginProfileModel{[DisplayName("LoginID")][Required(ErrorMessage="LoginIDisrequired.")]publicstringLogonID{get;放;}[DisplayName("Password")][Required(ErrorMessage="Passwordcannotbeblank.")][StringLength(20,MinimumLength=3)][DataType(DataType.Password)]publicstringPassword{get;放;}}这是ASP.NetMVC4中的LoginProfileModel。它使用各种元数据/数据注释,以便我可以使用以下方法创建干净的视图:@modelmyWebSite.Areas.People.Models.LoginProfileModel@using(Html.BeginForm("Index","Login")){@Html.ValidationSummary()@Html.EditorForModel()}我在多个视图中使用“登录ID”和“密码”的概念,因此,在多个视图模型中。我希望能够定义密码使用的属性,或者密码本身及其在一个地方注释的所有数据,以便我可以在需要时重用所有这些定义,而不是每次使用它们时都重新分配它们:[DisplayName("Password")][Required(ErrorMessage="Passwordcannotbeblank.")][StringLength(20,MinimumLength=3)][DataType(DataType.Password)]publicstringPassword{get;放;}这可能吗?以下属性会影响视图的验证过程。[Required(ErrorMessage="Passwordcannotbeblank.")][StringLength(20,MinimumLength=3)]对于Validation属性,可以这样创建一个类:publicclassPasswordRuleAttribute:ValidationAttribute{publicoverrideboolIsValid(objectvalue){if(newRequiredAttribute{ErrorMessage="密码不能为空。"}.IsValid(value)&&newStringLengthAttribute(20){MinimumLength=3}.IsValid(value))returntrue;返回假;您可以按以下方式使用它:[PasswordRule]publicstringPassword{get;set;}您提到的其他两个属性是直接从Attribute类派生的,我认为没有办法将它们组合起来成一个单一的属性。我会尽快更新您的编辑。所以现在我们开始了:[DisplayName("Password")][DataType(DataType.Password)][PasswordRule]publicstringPassword{get;set;}编辑:根据这篇文章:复合属性,无法组合特性。您可以使用向视图模型提供元数据的伙伴类来执行此操作。像这样:publicpartialclassLogonMetaData{[DisplayName("LoginID")][Required(ErrorMessage="LoginIDisrequired.")]publicstringLogonID{get;放;}[DisplayName("Password")][Required(ErrorMessage="Passwordcannotbeblank.")][StringLength(20,MinimumLength=3)][DataType(DataType.Password)]publicstringPassword{get;放;然后你的视图模型:使用System.ComponentModel.DataAnnotations;[MetadataType(typeof(LogonMetaData))]publicpartialclassFirstViewModel{publicstringLogonID{get;放;}公共字符串密码{得到;放;}}使用System.ComponentModel.DataAnnotations;[MetadataType(typeof(LogonMetaData))]publicpartialclassSecondViewModel{publicstringLogonID{get;放;}公共字符串密码{得到;放;}}注意类定义中partial的使用。这就是使该方法起作用的原因。一个警告,除了DRY的明显问题之外,我认为元数据类必须与视图模型位于相同的命名空间中,否则它会报错。除此之外,这应该做你想做的。作为JohnH的回答的必然结果,您可以使用继承并使那些具有“LogonId和密码概念”的视图模型从该基本视图模型继承。这将解决上一个答案中提到的元数据问题。publicclassLoginProfileModel{[DisplayName("LoginID")][Required(ErrorMessage="LoginIDisrequired.")]publicstringLogonID{get;放;}[DisplayName("Password")][Required(ErrorMessage="Passwordcannotbeblank.")][StringLength(20,MinimumLength=3)][DataType(DataType.Password)]publicstringPassword{get;放;}}publicSomeOtherClassThatNeedsLoginInfo:LoginProfileModel{publicstringProperty{get;set;}}现在,在SomeOtherClassThatNeedsLoginInfo中,您可以使用这些属性及其关联的DataAnnotations。另一个想法是将LoginInfo作为属性传递给其他视图模型。以上是C#学习教程:有没有办法复用数据注解?所有分享的内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——publicSomeOtherClassThatNeedsLoginInfo{publicstringProperty{get;set;}publicLoginProfileModelLoginModel{get;set;}}本文来自网络收藏,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
