我有一个模型CompanyInfoModel
它有这样的字段:
[Display(Name = "CompanyName", ResourceType = typeof(i18n))]
[StringLength(64, ErrorMessageResourceType = typeof(i18n), ErrorMessageResourceName = "InvalidCompanyLength")]
public string CompanyName { get; set; }
在控制器中,在某种条件下的get方法中,我必须使属性CompanyName
成为必需(此属性并不总是必需的)。由于@Html.EditorFor
的自定义实现,我无法在视图中添加必需的属性。
如何将required
属性添加到控制器中的属性?
答案 0 :(得分:2)
条件验证这里有几个选项
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)在控制器中进行(不推荐!)
答案 1 :(得分:0)
使用视图模型:
public class CompanyInfoViewModel {
[Required]
public string CompanyName { get; set; }
}
在该视图模型中添加您需要的任何其他信息,并使用视图模型作为后期操作的参数类型,或者创建一个自定义模型绑定器,将视图模型映射回域模型。
答案 2 :(得分:0)
我已经找到了使用JQuery执行此操作的其他方法。我跑了
$("#CompanyName").prop('required',true);
当我需要它时。