ASP NET MVC: динамическое добавление или удаление входных данных в форме - ненавязчивая проверка - PullRequest
4 голосов
/ 04 февраля 2011

Перед тем, как начать, у меня есть очень специфический вопрос, и если вы хотите ответить на него, переходите прямо к концу.Но я приветствую комментарии и советы, следовательно, длинный пост.

Хорошо, мы имеем дело с множеством форм, и некоторые из этих форм довольно длинные и имеют много полей.У нас также есть требование - в дополнение к полям верхнего уровня - иметь возможность иметь переменное количество повторяющихся строк - как мы их называем.Например, давайте подумаем о клиенте, у которого есть имя, фамилия и возраст, в то время как у него может быть ноль или много адресов (скажем, от 0 до 10), поэтому пользователь должен иметь возможность добавлять или удалять контакты из формы при ее заполнении. Поэтому обычнопользователь получает и кнопку «Добавить», чтобы добавить больше адресов, а рядом с каждым адресом, кнопку удаления.Потенциально может быть более одного повторяющегося раздела в той же форме, но я не собираюсь туда.Дело в том, что по юридическим и историческим причинам все формы должны быть сохранены одновременно, поэтому, пока формы можно редактировать, мы не можем принять наполовину заполненную форму и иметь другую страницу для пользователей, чтобы добавлять и удалять адреса, например,

Я использую ASP NET MVC 2 (строго типизированные представления с одним универсальным контроллером) с проверкой на стороне клиента и мощными сценариями jquery для ярких функций.Мы, вероятно, очень скоро перейдем на ASP NET MVC 3, и я уже играю с 3, чтобы найти хорошее решение.Эти адреса определены в модели как List<Address>, например,

. В настоящее время у меня есть рабочее решение для этой проблемы, но я не удовлетворен им: у меня есть помощник HTML, который называет кнопки добавления или удаления инемного JavaScript, чтобы отключить проверку и разрешить отправку формы (даже недействительной), и, поскольку я могу узнать имя кнопки, на которую нажали, у меня есть вся необходимая логика для обработки добавления или удаления, и она работает очень хорошо.

Но я отправляю сообщение, и форма перезагружается, и я ищу альтернативное решение.Вот что я могу сделать:

  • Делать все на стороне клиента.Кнопка «Добавить» клонирует один из таких адресов, а кнопка «Удалить» - remove() элемент.Мне нужно только переименовать индексы, которые я сделал.Мы использовали календарь jquery, и он ломал новые элементы, которые я также исправил.Но проверка не работает, что, вероятно, может работать с ASP NET MVC, но это решение выглядит очень хрупким - карточный домик, который отлично смотрится, прежде чем добавить другую карту.
  • Разместите всю страницу с помощью Ajax изатем загрузите его снова: это, вероятно, лучше, чем мое текущее решение, но ненамного.
  • Используйте ajax, чтобы опубликовать форму и получить обратно JSON, а также использовать данные для построения элементов или их удаления: Снова дом изкарта из-за обширных сценариев на стороне клиента
  • Сериализуйте форму и отправьте с помощью Ajax определенное действие и верните только повторяющийся раздел (как частичное представление).Действие на контроллере можно использовать повторно и вызывать из самого представления, чтобы вернуть частичное представление

    ОК. Последнее - это то, над которым я работаю, но есть проблема.ASP NET MVC 3 с ненавязчивой проверкой работает, только если форма заполнена в BeginForm(), в то время как мое представление верхнего уровня имеет BeginForm(), но не мое частичное представление.Это работает хорошо, когда я вызываю его из представления, но не по вызову ajax, чтобы получить только повторяющийся раздел.

(Вопрос)

Так есть ли способ заставить ASP NET MVC 3 выдавать атрибуты валидационных данных независимо от того, находятся ли они в блоке BeginForm ()??Если честно, если это не ошибка, это определенно важный запрос функции. На самом деле я использовал отражатель для дизассемблирования кода, и, похоже, условие там.

Ответы [ 2 ]

2 голосов
/ 07 февраля 2011

Краткий ответ:

Добавьте это к частичному виду:

if (ViewContext.FormContext == null)
{ 
    ViewContext.FormContext = new FormContext();
}
1 голос
/ 04 февраля 2011

Я не думаю, что это возможно при использовании поставляемых по умолчанию ненавязчивых библиотек.Если вы посмотрите на jquery.validate.js и jquery.validate.unobtrusive.js, похоже, что он проверяет только то, что находится внутри формы.

Есть несколько сообщений об этом, если Googled, и несколько обходных путей.

У меня была похожая проблема (хотя и намного проще), когда у меня была сводка проверки в верхней части страницы и несколько форм, но ненавязчивый javascript заполнял бы сводку представления, только если она находится внутри формы (jquery.validate).unobtrusive.js строка 39, если интересно ...).

Я не уверен, является ли библиотека валидации расширяемой, но большинство вещей в jquery таковы, что это может быть вариантом, если вы хотите пойти по этому пути.

В качестве возможного решения вашей проблемы я положу свои 2 цента, чтобы узнать, сколько это стоит.

У вас может быть два действия, которые будут опубликованы.Первое действие - вы публикуете свою модель без проверки js, и вся проверка выполняется в коде - это поймает всех пользователей с отключенным javascript.

Второе действие - сериализация модели.В mvc 3 с помощью Ajax.BeginForm есть AjaxOption для Url, где вы можете указать действие для вызова jquery (где он сериализует форму формы, которую вы можете, и вы можете украсить свое действие своей строго типизированной моделью).Здесь вы можете проверить модель и вернуть результат json и обработать его в javascript.

...