Asp.net mvc 如何通过多次验证从属性中删除单个错误
在我的ViewModel中,我有一个属性具有多个验证错误,如下所示Asp.net mvc 如何通过多次验证从属性中删除单个错误,asp.net-mvc,validation,modelstate,Asp.net Mvc,Validation,Modelstate,在我的ViewModel中,我有一个属性具有多个验证错误,如下所示 [Required(ErrorMessage = "Required")] [RegularExpression(@"^(\d{1,2})$", ErrorMessage = "Only numbers admitted")] [MaxLength(3, ErrorMessage = "MaxLength is 3")] public string MyField { get; set; } “必需”验证取决于用户在另一个字段
[Required(ErrorMessage = "Required")]
[RegularExpression(@"^(\d{1,2})$", ErrorMessage = "Only numbers admitted")]
[MaxLength(3, ErrorMessage = "MaxLength is 3")]
public string MyField { get; set; }
“必需”验证取决于用户在另一个字段上的输入,因此在控制器中,我希望从ModelState中删除错误。我找到的唯一方法是:
if (view.OtherField != null && view.OtherField.Trim() != "" && ModelState.ContainsKey("MyField"))
{
//removing all errors from "MyField"
ModelState["MyField"].Errors.Clear();
//checking length
if (view.MyField.Length > 3)
ModelState.AddModelError("MyField", "MaxLength is 3");
//checking the value
Regex regex = new Regex(@"(\d{1,2})");
if (!regex.IsMatch(view.MyField))
ModelState.AddModelError("MyField", "Only numbers admitted");
}
是否有一种方法可以选择性地仅删除“必需”错误,而不必删除MyField属性的整个ModelState错误,然后重新添加其他错误?出于您的目的,您必须创建自定义验证属性,如
[RequiredIf]
:-
[AttributeUsageAttribute(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = true)]
public class RequiredIfAttribute : RequiredAttribute
{
private string OtherProperty { get; set; }
private object Condition { get; set; }
public RequiredIfAttribute(string otherProperty, object condition)
{
OtherProperty = otherProperty;
Condition = condition;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var property = validationContext.ObjectType.GetProperty(OtherProperty);
if (property == null)
return new ValidationResult(String.Format("Property {0} not found.", OtherProperty));
var propertyValue = property.GetValue(validationContext.ObjectInstance, null);
var conditionIsMet = Equals(propertyValue, Condition);
return conditionIsMet ? base.IsValid(value, validationContext) : null;
}
}
型号:-
[RequiredIf("OtherField", "")]
[RegularExpression(@"^(\d{1,2})$", ErrorMessage = "Only numbers admitted")]
[MaxLength(3, ErrorMessage = "MaxLength is 3")]
public string MyField { get; set; }
public string OtherField {get; set;}
在上面的回答中,如果
其他字段
值为空,则需要我的字段
,否则不需要。我刚刚在我的应用程序中完成了它的实现,它可以工作!非常感谢你!我唯一不确定的是,我不知道这是否是为了使它适应我的代码而必须做的小改动,但是如果fieldA是空的,fieldB有一些内容,那么验证错误“Required”会显示在fieldB而不是fieldA上。我解决了将两个属性的名称作为RequirediftAttribute的参数进行比较的问题