Asp.net mvc 3 MVC 3列表的不引人注目的验证

Asp.net mvc 3 MVC 3列表的不引人注目的验证,asp.net-mvc-3,validation,unobtrusive-validation,asp.net-mvc-validation,Asp.net Mvc 3,Validation,Unobtrusive Validation,Asp.net Mvc Validation,问题 我已经创建了一个服务器端属性级验证属性。但我没有将其应用于单个字段,而是将其应用于列表。这使我能够从整体上验证模型 我现在需要知道如何使用MVC3内置的不引人注目的客户端验证将其转换为工作 下面是我当前的代码来说明我的问题 场景 基本场景是能够合计按GroupNo字段分组的列表中每一行的所有数量值。如果任何组的总和超过10,则应显示错误 在前一篇文章中,我得到了一个很好的答案,让这项工作在服务器端使用一个针对列表的验证属性 模型: public class ItemDetails {

问题

我已经创建了一个服务器端属性级验证属性。但我没有将其应用于单个字段,而是将其应用于列表。这使我能够从整体上验证模型

我现在需要知道如何使用MVC3内置的不引人注目的客户端验证将其转换为工作

下面是我当前的代码来说明我的问题

场景

基本场景是能够合计按GroupNo字段分组的列表中每一行的所有数量值。如果任何组的总和超过10,则应显示错误

在前一篇文章中,我得到了一个很好的答案,让这项工作在服务器端使用一个针对列表的验证属性

模型:

public class ItemDetails
{
    public int SerialNo { get; set; }
    public string Description { get; set; }
    public int GroupNo { get; set; }
    public decimal Price { get; set; }
    public int Quantity { get; set; }
}

public class MyViewModel
{
    [EnsureMaxGroupItems(10, ErrorMessage = "You cannot have more than 10 items in each group")]
    public IList<ItemDetails> Items { get; set; }
}
接下来是相应的强类型视图:

@model MyViewModel
@Html.ValidationSummary()
@using (Html.BeginForm())
{
    @Html.EditorFor(x => x.Items)
    <button type="submit">Go go go</button>
}
客户端是否可以进行不引人注目的验证?

我希望所有这些都使用不引人注目的MVC验证进行验证。但我不知道如何在整个列表中悄悄地验证EnsureMaxGroupItemsAttribute属性

我通过以下方式实现了IClientValidable:

    Public Function GetClientValidationRules(metadata As System.Web.Mvc.ModelMetadata, context As System.Web.Mvc.ControllerContext) As System.Collections.Generic.IEnumerable(Of System.Web.Mvc.ModelClientValidationRule) Implements System.Web.Mvc.IClientValidatable.GetClientValidationRules

        Dim result = New List(Of ModelClientValidationRule)

        Dim rule = New ModelClientValidationRule() With { _
            .ErrorMessage = "You cannot have more than 10 items in each group", _
            .ValidationType = "itemscheck"}

        result.Add(rule)

        Return result

    End Function
注意:VB和C的混合只是因为我前面问的问题是用C回答的。这个项目是用VB编写的,但我不介意用C#来回答

我已经在JS文件中创建了适配器:

jQuery.validator.unobtrusive.adapters.addBool("itemscheck"); 
。。。而且

jQuery.validator.addMethod("itemscheck", function (value, element, params) {
    // The check has been omitted for the sake of saving space.  
    // However this method never gets called
    return false;
});

有没有一种方法可以将其连接起来以不引人注目的方式工作?

这是不可能的,因为您的自定义属性被放置在集合属性中,并且根本没有发出HTML5
数据-*
属性。这不是不引人注目的客户端验证框架所支持的场景。如果需要客户端验证,可以直接编写自定义jquery验证规则来处理此场景。

阅读后,我认为这是不可能的。虽然这谈论的是IValidatableObject而不是ValidationAttribute,但我只能认为,因为我将其分配给一个列表,所以效果是相同的。我认为我唯一的解决方案是完全删除不引人注目的验证,只使用jQuery进行验证。我以前没有真正尝试过在不使用“不引人注目”的情况下进行任何验证。目前,我在提交表单的js文件中有自己的函数(我没有标准的提交按钮)。这只是一个将我的验证代码放入此函数的情况,如果无效,我不会提交。这样做,页面上就不会有内置的验证摘要,所以我考虑适当地显示/隐藏。或者你是在暗示有一种更自动的方法来完成这项工作,如果是的话,它能与验证摘要一起工作吗?我会直接插入jQuery验证插件。谢谢,我想我正在慢慢地弄明白,将jQuery.validate.addMethod添加到我的js中。几个问题:-1)我将如何像上面的原始问题那样连接表单级验证检查?即使它应用于不同行上的多个控件,我也必须将它连接到一个控件吗?2) 对于不引人注目的验证,我已经习惯了验证摘要——要对插件进行同样的验证,我需要定制淋浴器并建立自己的等效项吗?3) 服务器端错误如何与此结合使用?我还会有一个Html.ValidationSummary来为它们服务吗?您可以为每个数量字段连接验证。这样,当其值更改时,验证将生效。就显示错误消息而言,您可以覆盖jquery验证插件的淋浴ROR方法,该方法允许您在ValidationSummary助手生成的span占位符中显示错误消息。
    Public Function GetClientValidationRules(metadata As System.Web.Mvc.ModelMetadata, context As System.Web.Mvc.ControllerContext) As System.Collections.Generic.IEnumerable(Of System.Web.Mvc.ModelClientValidationRule) Implements System.Web.Mvc.IClientValidatable.GetClientValidationRules

        Dim result = New List(Of ModelClientValidationRule)

        Dim rule = New ModelClientValidationRule() With { _
            .ErrorMessage = "You cannot have more than 10 items in each group", _
            .ValidationType = "itemscheck"}

        result.Add(rule)

        Return result

    End Function
jQuery.validator.unobtrusive.adapters.addBool("itemscheck"); 
jQuery.validator.addMethod("itemscheck", function (value, element, params) {
    // The check has been omitted for the sake of saving space.  
    // However this method never gets called
    return false;
});