是否可以覆盖模型中属性的必需属性?

Rya*_*ith 18 c# asp.net asp.net-mvc modelmetadata asp.net-mvc-3

我很想知道是否可以覆盖模型上设置的[Required]属性.我相信这个问题最简单的解决方案,任何接受者?

Hac*_*ese 19

取决于你究竟在做什么.如果您正在使用子类,使用具有Required属性作为基础的模型,您可以执行以下操作:

使用new关键字重新定义属性,而不是覆盖它.

public class BaseModel
{
    [Required]
    public string RequiredProperty { get; set; }
}


public class DerivativeModel : BaseModel
{
    new public string RequiredProperty { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

如果您只想绑定或验证模型,但跳过控制器中的Required属性,则可以执行以下操作:

public ActionResult SomeAction()
{
     var model = new BaseModel();

     if (TryUpdateModel(model, null, null, new[] { "RequiredProperty" })) // fourth parameter is an array of properties (by name) that are excluded
     {
          // updated and validated correctly!
          return View(model);
     }
     // failed validation
     return View(model);
}
Run Code Online (Sandbox Code Playgroud)

  • 奇怪,但这对我不起作用.我有一个属性[范围(0,999999)],子类有[范围(0,2000)]但验证选择父项而不是子项 (4认同)
  • 这不起作用 `public class BaseModel { [Required] public string requiredProperty { get; 放; } } 公共类 DerivativeModel : BaseModel { 新的公共字符串RequiredProperty { get; 放; } }` (2认同)
  • 我尝试了这个,[Required] 属性也应用于继承的属性。我认为最初问题的重点是如何在继承的对象中覆盖该属性。 (2认同)

Sai*_*ito 14

@HackedByChinese方法很好,但它包含一个问题

public class BaseModel
{
    [Required]
    public string RequiredProperty { get; set; }
}

public class DerivativeModel : BaseModel
{
    new public string RequiredProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

ModelState如果您DerivativeModel在表单上使用此代码,则会在EVEN中显示验证错误,override但也不能正常工作,因此您无法Required通过覆盖或续订来删除属性,因此我找到了某种解决方法

public class BaseModel
{
    public virtual string RequiredProperty { get; set; }
}

public class DerivativeModel : BaseModel
{
    [Required]
    public override string RequiredProperty { get; set; }
}

public class DerivativeModel2 : BaseModel
{
    [Range(1, 10)]
    public override string RequiredProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个没有验证属性和派生类的基本模型


Mah*_*ati 5

您可以使用自定义验证属性(它可以从RequiredAttribute派生):

 public class RequiredExAttribute : RequiredAttribute
    {
        public bool UseRequiredAttribute { get; protected set; }
        public RequiredExAttribute(bool IsRequired)
        {
            UseRequiredAttribute = IsRequired;
        }
        public override bool IsValid(object value)
        {
            if (UseRequiredAttribute)
                return base.IsValid(value);
            else
            {
                return true;
            }
        }

        public override bool RequiresValidationContext
        {
            get
            {
                return UseRequiredAttribute;
            }
        }
    }

    public class RequiredExAttributeAdapter : RequiredAttributeAdapter
    {
        public RequiredExAttributeAdapter(ModelMetadata metadata, ControllerContext context, RequiredExAttribute attribute)
            : base(metadata, context, attribute) { }

        public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
        {
            if (((RequiredExAttribute)Attribute).UseRequiredAttribute)// required -> return normal required rules
                return base.GetClientValidationRules();
            else// not required -> return empty rules list
                return new List<ModelClientValidationRule>();
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后Application_Start使用以下代码行对其进行注册:

 DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RequiredExAttribute), typeof(RequiredExAttributeAdapter));
Run Code Online (Sandbox Code Playgroud)