У нас есть приложение ASP.NET MVC 3, которое использует ненавязчивую проверку jQuery. Страница позволяет одновременно добавлять дочерние объекты в модель. <form>
содержит сетку для дочерних элементов и некоторые поля ввода для добавления новых дочерних элементов.
Упрощенный пример с выпуском в качестве модели и подзадачами в качестве дочерних элементов:
Issue.cshtml -> Определяет форму и включает поля для проблемы, а также ее подзадачи.
@model Issue
@using (Html.BeginForm("Create", "Issues", FormMethod.Post, new { id = "mainForm" })
{
@Html.TextBoxFor(model => model.Summary)
@Html.Partial("SubtaskFields", new Subtask())
@Html.Partial("SubtasksGrid", model.Subtasks)
}
SubtaskFields.cshtml:
@model Subtask
@Html.TextBoxFor(model => model.Summary)
<button id="add">Add</button>
SubtasksGrid.cshtml:
@model IEnumerable<Subtask>
<table>
@foreach (var subtask in Model)
{
<tr>
<td>
@subtask.Name
<input type="hidden" name="Subtasks[@subtask.Index].Name" value="@subtask.Name"/>
</td>
</tr>
}
</table>
Суть в том, что при отправке формы необходимо проверять и отправлять только свойства проблемы (Issue.Name, например), а также скрытые поля для дочерних элементов (Subtask.Name, например).
У нас есть некоторый код javascript, который перехватывает кнопку «добавить» и добавляет новую подзадачу на основе значений в частичном представлении SubtaskFields.cshtml . Этот скрипт сначала проверяет поля ввода. Чтобы это работало, мы используем TextBoxFor
и т. Д. Html-помощники для SubtaskFields.cshtml , также визуализирующих фиктивный / подзадачный объект по умолчанию (new Subtask()
). Наш javascript использует $("#mainForm").validate().element(...)
для проверки SubtaskFields перед добавлением новой подзадачи.
Большая проблема с этим подходом заключается в том, что ненавязчивая среда проверки jQuery автоматически перехватывает кнопку отправки и проверяет все полей в форме перед отправкой формы. Т.е. даже поля подзадач проверяются. Это не имеет никакого смысла. Скажите, что имя подзадачи является обязательным (это означает, что пользователь может нажать «добавить» только в том случае, если он заполнил имя подзадачи). Но если пользователь не нажимает «добавить», значения в полях подзадач не имеют никакого значения и, в частности, могут быть оставлены пустыми. В этом случае в нашем текущем параметре проверка jQuery завершится неудачно, поскольку обязательное поле оставлено пустым.
Как это можно решить?