说我有以下课程:
public class ContactUsFormModel : AddressModel
{
[DisplayName("Title")]
[StringLength(5)]
public string Title { get; set; }
[DisplayName("First name (required)")]
[Required(ErrorMessage = "Please enter your first name")]
[StringLength(50, ErrorMessage = "Please limit your first name to {1} characters.")]
public string FirstName { get; set; }
// etc...
}
我是否可以从AddressModel
类中的ContactUsFormModel
类向属性添加必需属性?
答案 0 :(得分:5)
尝试使用MetadatatypeAttribute。为元数据创建seprate类,直接向属性添加属性。
[MetadataType(typeof(MyModelMetadata ))]
public class ContactUsFormModel : AddressModel
{
[DisplayName("Title")]
[StringLength(5)]
public string Title { get; set; }
[DisplayName("First name (required)")]
[Required(ErrorMessage = "Please enter your first name")]
[StringLength(50, ErrorMessage = "Please limit your first name to {1} characters.")]
public string FirstName { get; set; }
// etc...
}
internal class MyModelMetadata {
[Required]
public string SomeProperyOfModel { get; set; }
}
<强> [编辑] 强> 上面的方法对你没用,因为你说它不会向基类添加属性。
因此,在ContactUsFormModel中使用AddressModel virtual
和override
中的属性,这样就可以添加属性。
答案 1 :(得分:0)
好的,我已经通过在类中添加一个新属性找到了解决方法:
public bool AddressIsRequired { get; set; }
我可以在为不同的表单构建模型时设置它,然后使用正常的必需属性,而不是使用正常的自定义验证器:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = true)]
public sealed class AddressRequiredAttribute : RequiredAttribute, IClientValidatable
{
public AddressRequiredAttribute()
: base()
{
}
protected override ValidationResult IsValid(object value, ValidationContext context)
{
Type addresType = typeof(AddressModel);
if (context.ObjectType == addresType || context.ObjectType.BaseType == addresType)
{
AddressModel baseModel = (AddressModel)context.ObjectInstance;
if (baseModel != null && baseModel.AddressIsRequired)
{
return base.IsValid(value, context);
}
}
return ValidationResult.Success;
}
}
然后在我的AddressModel中,我可以标记我的属性:
[AddressRequired(ErrorMessage = "Please enter your Postcode")]
public string Postcode { get; set; }
如果有人能够找到更好的方法(即能够只更改数据注释而不必创建单独的属性),我将保持开放状态。这种做法也意味着如果你扩展label for helper并使用元数据来检查IsRequired标志,那么用这个属性标记的属性将始终被标记为必需(我认为这可能是因为它继承了所需的属性)