C# mvc条件模型验证帮助

C# mvc条件模型验证帮助,c#,asp.net-mvc,asp.net-mvc-3,C#,Asp.net Mvc,Asp.net Mvc 3,我使用的是asp.net MVC 3,在我的模块中有两种付款模式1。电汇和2。贝宝。现在,根据类型1和类型2,属性将保留为必需或其他数据注释!如何做到这一点? 例如: 付款类型有一个单选按钮 如果选择类型1-即电汇,则应验证这些字段-姓名、姓氏、电子邮件、受益人姓名、银行名称、银行编号、ifsc代码等 如果是类型2-即PayPal,则这些字段是必填的-PayPal电子邮件 这可以通过手动验证来完成,但是有没有一些方法可以用DataAnnotations正确地完成呢?您可以编写一个自定义验证程序属

我使用的是asp.net MVC 3,在我的模块中有两种付款模式1。电汇和2。贝宝。现在,根据类型1和类型2,属性将保留为必需或其他数据注释!如何做到这一点? 例如:

付款类型有一个单选按钮

如果选择类型1-即电汇,则应验证这些字段-姓名、姓氏、电子邮件、受益人姓名、银行名称、银行编号、ifsc代码等 如果是类型2-即PayPal,则这些字段是必填的-PayPal电子邮件


这可以通过手动验证来完成,但是有没有一些方法可以用DataAnnotations正确地完成呢?

您可以编写一个自定义验证程序属性,并用它装饰您的模型:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class CustomValidationAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        var model = value as MyViewModel;
        if (model == null)
        {
            return false;
        }
        if (model.WireTransfer == 1)
        {
            return !string.IsNullOrEmpty(model.FirstName) &&
                   !string.IsNullOrEmpty(model.LastName);
        }
        else if (model.WireTransfer == 2)
        {
            return !string.IsNullOrEmpty(model.PaypalEmail);
        }
        return false;
    }
}
然后在主模型中:

[CustomValidation]
public class MyViewModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    ...
}

我使用了来自的方法,效果很好。基本上,他创建了一个RequiredIf数据属性,您可以在其中指定其他属性和值,这些属性和值必须为true,才能使当前字段成为必需字段。

Simon Ince的博客文章似乎过时了

无需使用DataAnnotationsModelValidator或进行DataAnnotationsModelValidator注册

您可以使用以下代码:

[AttributeUsage(AttributeTargets.Property, AllowMultiple=false)]
public class RequiredIfAttribute : ValidationAttribute, IClientValidatable {
    private const string _defaultErrorMessage = "'{0}' is required when {1} equals {2}.";

    public string DependentProperty { get; set; }
    public object TargetValue { get; set; }

    public RequiredIfAttribute(string dependentProperty, object targetValue):base(_defaultErrorMessage) {
        this.DependentProperty = dependentProperty;
        this.TargetValue = targetValue;
    }
    public override string FormatErrorMessage(string name) {
        return String.Format(CultureInfo.CurrentCulture, ErrorMessageString, name, DependentProperty, TargetValue);
    }
    protected override ValidationResult IsValid(object value, ValidationContext context) {
        if (context.ObjectInstance != null) {
            Type type = context.ObjectInstance.GetType();
            PropertyInfo info = type.GetProperty(DependentProperty);
            object dependentValue;
            if (info != null) {
                dependentValue = info.GetValue(context.ObjectInstance, null);
                if (object.Equals(dependentValue, TargetValue)) {
                    if (string.IsNullOrWhiteSpace(Convert.ToString(value))) {
                        return new ValidationResult(ErrorMessage);
                    }
                }
            }
        }
        return ValidationResult.Success;
    }
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) {
        ModelClientValidationRule rule = new ModelClientValidationRule();
        rule.ErrorMessage = this.FormatErrorMessage(metadata.PropertyName);
        rule.ValidationType = "requiredif";
        rule.ValidationParameters.Add("depedentproperty", DependentProperty);
        rule.ValidationParameters.Add("targetvalue", TargetValue);
        yield return rule;
    }
}

我已经更新了我的示例以使用MVC3,因此其中一个更为最新


thnx!!但问题是,在这种情况下,客户端验证将不起作用?@bhuvin,不,它将不起作用,但您可以通过实现IClientValidatable使其起作用:@darin已尝试过其他方法,但仍然不起作用working@bhuvin,不工作是不够的。你到底试过什么?到底是什么不起作用?我在之前的评论中链接的博客文章非常清楚,它说明了一个工作示例。还有一本你可以读的书。Thnx Darin!!非常感谢你!!
    $.validator.unobtrusive.adapters.add('requiredif', ['depedentproperty', 'targetvalue'], function (options) {
    options.rules["required"] = function (element) {
        return $('#' + options.params.depedentproperty).val() == options.params.targetvalue
    };
    if (options.message) {
        options.messages["required"] = options.message;
    }
    $('#' + options.params.depedentproperty).blur(function () {
        $('#' + options.element.name).valid();
    });
});