Я играл с ASP.NET MVC Framework, и одна вещь, которая меня действительно сбивает с толку, заключается в том, как я должен выполнять проверку на стороне сервера размещенных данных формы. Я полагаю, что я не вернусь назад к тому же URL-адресу, но если этого не произойдет, как мне отобразить форму с введенными данными и сообщениями об ошибках? Кроме того, где должна идти логика проверки? В модели или контроллере? Это, по-видимому, одна из немногих областей, где веб-формы намного сильнее (я пропускаю контроль проверки).
Проверка опубликованных данных формы в структуре ASP.NET MVC
Ответ 1
Возможно, вам стоит взглянуть на последнее сообщение ScottGu для ASP.Net prev 5. Он просматривает образец проверки, который очень интересен:
Ответ 2
Здесь представлен обзор потока в MVC:
- /new - отобразите ваш "новый" вид, содержащий форму для пользователя, чтобы заполнить
- Пользователь заполняет форму и отправляется в /create
- Сообщение перенаправляется на действие Создать на вашем контроллере.
- В вашем методе действий обновите модель с данными, которые были опубликованы.
- Ваша модель должна проверять себя.
- Ваш контроллер должен прочитать, если модель действительна.
- Если модель действительна, сохраните ее на свой db. Перенаправление в /show для рендеринга show View для вашего объекта.
- Если модель недействительна, сохраните значения формы и сообщения об ошибках в TempData и снова перенаправите на новое действие. Заполните поля формы данными из TempData и покажите сообщения об ошибках.
Основы валидации помогут вам в этом процессе. Кроме того, я думаю, что команда ASP.NET MVC планирует рамки проверки для следующего предварительного просмотра.
Ответ 3
Насколько я могу судить, все еще пытаются понять "стандартный" способ сделать это. Это определенно проверяет последние статьи Phil Haack и Scott Guthrie на MVC, и вы найдете интересную информацию о том, как они это сделали. Когда я просто играл с ним для себя, я создал ModelBinder для класса данных LinqToSql, который я создал. Вы можете проверить этот пост, чтобы узнать, как собрать базовый ModelBinder:
В вашем действии, если вы создали "Product" ModelBinder, вы просто объявите действие следующим образом:
public ActionResult New (Product prod)
И связующее устройство модели позаботится о назначении размещенных данных свойствам объектов, если вы все равно его построили.
После этого в вашем методе GetValue() вы можете реализовать любую необходимую проверку, будь то с использованием исключений, регулярных выражений или любого другого, что вы можете сделать, например:
(ModelStateDictionary_name).AddModelError( "form_element_id", "введенное_значение", "error_message" );
Затем вы можете просто выбросить <% = Html.ValidationSummary()% > в своем представлении, чтобы отобразить все ваши ошибки.
Для проверки на стороне клиента я просто использовал jQuery. После того, как вы создадите базовый образец, вы можете начать делать интересные вещи, комбинируя все это с частичными представлениями и вызовами Ajax.
Ответ 4
Вы взглянули на это? http://www.codeplex.com/MvcValidatorToolkit
Цитата из страницы
Инструмент Validator Toolkit предоставляет набор валидаторов для нового ASP.NET MVC для проверки HTML-форм на клиент и серверная сторона наборы проверки.
Я боюсь, что кто-то из более опытных MVC, чем я, должен будет поговорить с тем, где в архитектуре вы должны поместить вещи.
Ответ 5
Я просто изучаю структуру MVC, поэтому я не уверен, как это происходит, но из того, что я понимаю, у вас будет форма в представлении, например Edit.aspx. Затем эта форма будет отправляться контроллеру в другой метод действия, такой как Update(), проходящий в содержимом формы, которую вы установили в Edit.aspx в качестве параметров.
Update(int id, string name, string foo)
Вы можете сделать валидацию внутри этого метода. Если все в порядке,
return View("Item", yourObject)
Ответ 6
В проекте Castle находится Castle.Components.Validator. Это очень гибкий и мощный. Он генерирует правила проверки на основе атрибутов модели (или любого другого источника) и даже способен генерировать проверку JS с помощью jQuery, Prototype Validation, fValidate и других. Разумеется, было бы разумно отвлечь валидатор за интерфейсом Ивалида.