Asp.net mvc 如何通过多次验证从属性中删除单个错误

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; } “必需”验证取决于用户在另一个字段

在我的ViewModel中,我有一个属性具有多个验证错误,如下所示

[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的参数进行比较的问题