我需要验证表单,这是我的模型:
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]
,有时候不,我怎么能这样做?
答案 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; }
}
ModelState.IsValid
设置为true且RatingIsRequired
为空,Rating
将返回false。[Required]
属性一样工作。如果有帮助,请告诉我。