根据需要添加dataAnnotation以验证表单+ mvc4

时间:2013-07-16 09:23:02

标签: c# asp.net-mvc-3 validation asp.net-mvc-4 data-annotations

我需要验证表单,这是我的模型:

 public class Movie {
    public int ID { get; set; }

    [Required]
    public string Title { get; set; }

    [DataType(DataType.Date)]
    public DateTime ReleaseDate { get; set; }

    [Required]
    public string Genre { get; set; }

    [Range(1, 100)]
    [DataType(DataType.Currency)]
    public decimal Price { get; set; }

    [StringLength(5)]
    public string Rating { get; set; }
}

我的问题是:我有一个包含cinemaId的querystringParam,当我读到这个从数据库读取的参数时,每个属性的配置是必需的还是没有。有时我需要在房产中添加[Required],有时候不,我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

您必须修改控制器操作中的ModelState

在您的帖子操作中,加载数据库配置检查每个属性,并将错误添加到ModelState属性,如下所示:

if (/* the property value is wrong */)
{
  ModelState.AddModelError("propertyName", "message");
}

这些错误将被视为由MVC框架使用数据注释生成(将样式添加到渲染控件,出现在错误列表中等等)。

如果属性是嵌套的,请使用点,如下所示:"property.subproperty.subproperty"作为属性名称参数。

答案 1 :(得分:0)

在@JotaBe给出的答案的基础上,您可以在Model属性本身上使用自定义验证属性。像这样:

条件必需属性

public class ConditionalRequiredAttribute : ValidationAttribute
{
    private const string DefaultErrorMessageFormatString 
                   = "The {0} field is required.";

    private readonly string _dependentPropertyName;

    public ConditionalRequiredAttribute(string dependentPropertyName)
    {
        _dependentPropertyName = dependentPropertyName;
        ErrorMessage = DefaultErrorMessageFormatString;
    }

    protected override ValidationResult IsValid(
                object item, 
                ValidationContext validationContext)
    {
        var property = validationContext
                         .ObjectInstance.GetType()
                         .GetProperty(_dependentPropertyName);

        var dependentPropertyValue = 
                            property
                            .GetValue(validationContext.ObjectInstance, null);

        int value;
        if (dependentPropertyValue is bool 
                           && (bool)dependentPropertyValue)
        {
            /* Put the validations that you need here */
            if (item == null)
            {
              return new ValidationResult(
                  string.Format(ErrorMessageString, 
                                validationContext.DisplayName));
            }
        }

         return ValidationResult.Success;
    }
}

应用属性

这里我有一个类Movie,需要根据RatingIsRequired布尔属性的值来进行评级,该属性可以从服务器设置。

public class Movie
{
   public bool RatingIsRequired { get; set; }

   [ConditionallyRequired("RatingIsRequired"]   
   public string Rating { get; set; }
}
  1. 如果ModelState.IsValid设置为true且RatingIsRequired为空,Rating将返回false。
  2. 此外,您可以为客户端启用的验证编写自定义不显眼的jquery验证器,以便像常规[Required]属性一样工作。
  3. 如果有帮助,请告诉我。