У меня есть список объектов, которые организованы в виде дерева с использованием свойства 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>
Проверка бизнес-правил
Как реализовать проверку бизнес-правила :
Сумма квоты должна равняться сумме вложенных квот (например, 200 = 50 + 150)?
Я хочу, чтобы соответствующие входы Html.TextBoxFor(m=>m.Amount)
были выделены красным, если для него нарушено правило.
Например, если пользователь вводит не 200, а 201 - он должен быть красным при отправке.
Используется только проверка сервера.
Большое спасибо за любые советы.