我有一个模型,CompanyInfoModel
它有这样的领域:
[Display(Name = "CompanyName", ResourceType = typeof(i18n))]
[StringLength(64, ErrorMessageResourceType = typeof(i18n), ErrorMessageResourceName = "InvalidCompanyLength")]
public string CompanyName { get; set; }
在控制器中,在一定条件下的get方法中,我必须使属性成为CompanyName
必需属性(此属性并非总是必需的)。由于的自定义实现,因此无法添加所需的属性@Html.EditorFor
。
如何required
在控制器的属性中添加属性?
对于条件验证,您可以在此处选择几个选项
1)创建一个自定义的必填属性,并实现打开/关闭必填字段所需的逻辑
public class CustomRequiredAttribute : RequiredAttribute
{
public override IsValid(object val, ValidationContext context)
{
if(SomeConditionisValid())
return base.IsValid(val, context);
else
return true; // the field is valid (e.g not required)
}
}
如果可以从模型中导出规则,则可以使用它来推动验证。该模型可从ValidationContext.ObjectInstance获得。
2)除了上述之外,您还可以实现IValidatableObject,该对象提供了可以在模型绑定期间执行验证规则的方法。同样,如果您可以完全从已验证的对象派生验证规则。
在模型上,实现IValidatableObject
IEnumerable<ValidationResult> Validate(
ValidationContext validationContext
if(SomethingIsInvalid())
yield return new ValidationResult("Something is invalid") { }
)
3)如果您需要模型外部的上下文来执行验证,请在自定义模型绑定程序中进行验证,例如从DefaultModelBinder继承并重写
protected virtual bool OnPropertyValidating(
ControllerContext controllerContext,
ModelBindingContext bindingContext,
PropertyDescriptor propertyDescriptor,
Object value
)
{
if(SomethingIsInvalid())
{
bindingContext.ModelState.AddModelError("Field", "Is Required");
}
base.OnPropertyValidating(controllerContext, bindingContext, propertyDescriptor)
}
然后注册该类型的模型资料夹
[ModelBinder(typeof(CompanyInfoModelBinder))]
public class CompanyInfoModel
{
}
4)在控制器中进行操作(不推荐!)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句