如何在控制器mvc中添加模型属性所需?

时间:2015-03-03 14:45:26

标签: c# asp.net-mvc

我有一个模型CompanyInfoModel它有这样的字段:

[Display(Name = "CompanyName", ResourceType = typeof(i18n))]
[StringLength(64, ErrorMessageResourceType = typeof(i18n), ErrorMessageResourceName = "InvalidCompanyLength")]
public string CompanyName { get; set; }

在控制器中,在某种条件下的get方法中,我必须使属性CompanyName成为必需(此属性并不总是必需的)。由于@Html.EditorFor的自定义实现,我无法在视图中添加必需的属性。

如何将required属性添加到控制器中的属性?

3 个答案:

答案 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);

当我需要它时。