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)
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)
我有一个没有验证属性和派生类的基本模型
您可以使用自定义验证属性(它可以从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)
归档时间: |
|
查看次数: |
17377 次 |
最近记录: |