列表中的MVC 3不显眼的验证(MVC 3 Unobtrusive validation of a

2019-09-19 10:50发布

我创建了一个服务器端性能级的验证属性。 但是,而不是把它应用到一个单独的领域,我把它应用到一个列表。 这让我来验证模型的全过程。

我现在需要知道如何转换这种使用内置到MVC 3不显眼的客户端验证工作。

我当前的代码如下说明我的问题...

脚本

基本情况是能力总量可达所有的每一行的数量值由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; }
}

和验证属性本身:

[AttributeUsage(AttributeTargets.Property)]
public class EnsureMaxGroupItemsAttribute : ValidationAttribute
{
    public int MaxItems { get; private set; }

    public EnsureMaxGroupItemsAttribute(int maxItems)
    {
        MaxItems = maxItems;
    }

    public override bool IsValid(object value)
    {
        var items = value as IEnumerable<ItemDetails>;
        if (items == null)
        {
            return true;
        }

        return items
            .GroupBy(x => x.GroupNo)
            .Select(g => g.Sum(x => x.Quantity))
            .All(quantity => quantity <= MaxItems);
    }
}

最后你的控制器动作将与视图模型的工作:

public ActionResult ListItems()
{
    var model = new MyViewModel
    {
        Items = ItemsRepository.GetItems()
    };
    return View(model);
}

[HttpPost]
public ActionResult ListItems(MyViewModel model)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }

    ...
}

旁边对应的强类型的观点:

@model MyViewModel
@Html.ValidationSummary()
@using (Html.BeginForm())
{
    @Html.EditorFor(x => x.Items)
    <button type="submit">Go go go</button>
}

最后一点是,它会自动被渲染为项目集合中的每个元素,让你甚至都不需要编写循环对应的编辑模板( ~/Views/Shared/EditorTemplates/ItemDetails.cshtml ):

@model ItemDetails
@Html.HiddenFor(x => x.SerialNo)
@Html.LabelFor(x => x.Description)
@Html.HiddenFor(x => x.GroupNo)
@Html.LabelFor(x => x.Price)
@Html.TextBoxFor(x => x.Quantity)

客户端不引人注目的验证可能吗?

我想这一切用不显眼的MVC验证验证。 但我无法弄清楚如何悄悄地验证对列表作为一个整体EnsureMaxGroupItemsAttribute属性。

我实现了IClientValidatable这样:

    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;
});

有没有办法挂钩这份长达悄悄地工作?

Answer 1:

因为你的自定义属性被放置在集合属性,也没有HTML5这是不可能的data-*在所有发出的属性。 它是不是由不显眼的客户端验证框架支持的情况下。 你可以直接写一个自定义JQuery验证规则,如果你需要它的客户端验证来处理这种情况。



文章来源: MVC 3 Unobtrusive validation of a list