Проверка опубликованных данных формы в структуре ASP.NET MVC

Я играл с ASP.NET MVC Framework, и одна вещь, которая меня действительно сбивает с толку, заключается в том, как я должен выполнять проверку на стороне сервера размещенных данных формы. Я полагаю, что я не вернусь назад к тому же URL-адресу, но если этого не произойдет, как мне отобразить форму с введенными данными и сообщениями об ошибках? Кроме того, где должна идти логика проверки? В модели или контроллере? Это, по-видимому, одна из немногих областей, где веб-формы намного сильнее (я пропускаю контроль проверки).

Ответ 2

Здесь представлен обзор потока в MVC:

  • /new - отобразите ваш "новый" вид, содержащий форму для пользователя, чтобы заполнить
    • Пользователь заполняет форму и отправляется в /create
    • Сообщение перенаправляется на действие Создать на вашем контроллере.
    • В вашем методе действий обновите модель с данными, которые были опубликованы.
    • Ваша модель должна проверять себя.
    • Ваш контроллер должен прочитать, если модель действительна.
    • Если модель действительна, сохраните ее на свой db. Перенаправление в /show для рендеринга show View для вашего объекта.
    • Если модель недействительна, сохраните значения формы и сообщения об ошибках в TempData и снова перенаправите на новое действие. Заполните поля формы данными из TempData и покажите сообщения об ошибках.

Основы валидации помогут вам в этом процессе. Кроме того, я думаю, что команда ASP.NET MVC планирует рамки проверки для следующего предварительного просмотра.

Ответ 3

Насколько я могу судить, все еще пытаются понять "стандартный" способ сделать это. Это определенно проверяет последние статьи Phil Haack и Scott Guthrie на MVC, и вы найдете интересную информацию о том, как они это сделали. Когда я просто играл с ним для себя, я создал ModelBinder для класса данных LinqToSql, который я создал. Вы можете проверить этот пост, чтобы узнать, как собрать базовый ModelBinder:

ASP.Net MVC Model Binder

В вашем действии, если вы создали "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 и других. Разумеется, было бы разумно отвлечь валидатор за интерфейсом Ивалида.