ASP.NET MVC 4中整个视图模型的不显眼验证

时间:2013-05-28 09:30:52

标签: jquery asp.net-mvc asp.net-mvc-4 viewmodel unobtrusive-validation

我有一个ASP.NET MVC 4应用程序,我希望对视图模型的几个属性进行不显眼的验证。这是一个简化版本:

ViewModel:

[AtLeastOne(new[] {"FirstName", "LastName"})]
public class PersonViewModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

验证属性:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class AtLeastOneAttribute : ValidationAttribute, IClientValidatable
{
    private readonly string[] _propertyNames;

    public AtLeastOneAttribute(string[] propertyNames)
    {
        if (propertyNames == null) throw new ArgumentNullException("propertyNames");
        if (propertyNames.Length < 2) throw new ArgumentOutOfRangeException("propertyNames");
        _propertyNames = propertyNames;
    }

    public override bool IsValid(object value)
    {
        return true;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var modelClientValidationRule = new ModelClientValidationRule
        {
            ErrorMessage = "AAAAA!!!",
            ValidationType = "atleastone",
        };
        modelClientValidationRule.ValidationParameters.Add(new KeyValuePair<string, object>("propertynames", _propertyNames));
        return new[]
        {
            modelClientValidationRule
        };
    }
}

虽然我有:

<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />

在Web.config和

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
    <script type="text/javascript">
        jQuery.validator.unobtrusive.adapters.add("atleastone", ['FirstName', 'LastName'], function (options) {
            alert('options!');
        });
    </script>

在我的视图中设置没有为此验证呈现任何内容。例如,如果我为FirstName或LastName添加[Required],则会添加data- * validation属性。

如何实现此多属性自定义客户端验证?

想要看到/ DOWNLOAD THE WHOLE SOLUTION

1 个答案:

答案 0 :(得分:2)

在客户端添加自定义验证器的过程分为两个步骤:

  1. 首先,您需要register validator {让unobtrusive框架知道存在此类验证 - 但不添加验证功能本身 ),就像你在jQuery.validator.unobtrusive.adapters.add中所做的那样。你必须记住功能(第三个参数)是而不是验证器,它只用于规则配置(在你的情况下可以省略)。

  2. 添加validator本身:

    jQuery.validator.addMethod("atleastone", function (value, element, param) { alert("validating 'atleastone'"); });

相关问题