Проверка бизнес-правил иерархического списка объектов ASP.NET MVC - PullRequest
2 голосов
/ 13 мая 2010

У меня есть список объектов, которые организованы в виде дерева с использованием свойства Depth:

public class Quota
{
    [Range(0, int.MaxValue, ErrorMessage = "Please enter an amount above zero.")]
    public int Amount { get; set; }

    public int Depth { get; set; }

    [Required]
    [RegularExpression("^[a-zA-Z]+$")]
    public string Origin { get; set; }

    // ... another properties with validation attributes
}

Для примера данных (количество - источник)

100 originA
200 originB
    50 originC
    150 originD

данные модели выглядят так:

IList<Quota> model = new List<Quota>();
model.Add(new Quota{ Amount = 100, Depth = 0, Origin = "originA");
model.Add(new Quota{ Amount = 200, Depth = 0, Origin = "originB");
model.Add(new Quota{ Amount = 50,  Depth = 1, Origin = "originC");
model.Add(new Quota{ Amount = 150, Depth = 1, Orinig = "originD");

Редактирование списка

Затем я использую Редактирование списка переменной длины, стиль ASP.NET MVC 2 , чтобы вызвать редактирование списка.

Действия контроллера QuotaController.cs :

public class QuotaController : Controller
{
    //
    // GET: /Quota/EditList
    public ActionResult EditList()
    {
        IList<Quota> model = // ... assigments as in example above;

        return View(viewModel);
    }

    //
    // POST: /Quota/EditList
    [HttpPost]
    public ActionResult EditList(IList<Quota> quotas)
    {
        if (ModelState.IsValid)
        {
            // ... save logic
            return RedirectToAction("Details");
        }
        return View(quotas); // Redisplay the form with errors
    }

    // ... other controller actions
}

Просмотр EditList.aspx :

<%@ Page Title="" Language="C#" ... Inherits="System.Web.Mvc.ViewPage<IList<Quota>>" %>

...
<h2>Edit Quotas</h2>
<%=Html.ValidationSummary("Fix errors:") %>
<% using (Html.BeginForm()) { 
     foreach (var quota in Model)
     {
         Html.RenderPartial("QuotaEditorRow", quota);
     } %>
<% } %>
...

Частичное представление QuotaEditorRow.ascx :

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Quota>" %>

<div class="quotas" style="margin-left: <%=Model.Depth*45 %>px">
    <% using (Html.BeginCollectionItem("Quotas")) { %>
        <%=Html.HiddenFor(m=>m.Id) %>
        <%=Html.HiddenFor(m=>m.Depth) %>


        <%=Html.TextBoxFor(m=>m.Amount, new {@class = "number", size = 5})%>
        <%=Html.ValidationMessageFor(m=>m.Amount) %>

        Origin:
        <%=Html.TextBoxFor(m=>m.Origin)%>
        <%=Html.ValidationMessageFor(m=>m.Origin) %>

        ...
    <% } %>
</div>

Проверка бизнес-правил

  1. Как реализовать проверку бизнес-правила : Сумма квоты должна равняться сумме вложенных квот (например, 200 = 50 + 150)?

  2. Я хочу, чтобы соответствующие входы Html.TextBoxFor(m=>m.Amount) были выделены красным, если для него нарушено правило. Например, если пользователь вводит не 200, а 201 - он должен быть красным при отправке.

  3. Используется только проверка сервера.

Большое спасибо за любые советы.

1 Ответ

1 голос
/ 13 мая 2010

Попробуйте FluentValidation . Это очень простая и мощная среда проверки, которая может проверять ваши классы на основе правил. Он также может быть использован для создания ClientSide JQuery Validators

Результатом проверки объекта является список объектов ValidationFailue. Вы можете повторить их или связать их с повторителем, который содержит неупорядоченный список, отформатированный красным.

IList<ValidationFailure> failures = results.Errors;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...