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

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


person Ben Mills    schedule 13.08.2008    source источник


Ответы (6)


Возможно, вы захотите взглянуть на последний пост ScottGu для ASP.Net prev 5. Он проходит через очень интересный пример проверки:

http://weblogs.asp.net/scottgu/archive/2008/09/02/asp-net-mvc-preview-5-and-form-posting-scenarios.aspx

person Robert Dean    schedule 05.09.2008

Вот обзор потока в MVC:

  1. /new - render your "New" view containing a form for the user to fill out
    • User fills out form and it is posted to /create
    • Пост перенаправляется на действие «Создать» на вашем контроллере.
    • В своем методе действий обновите модель с помощью опубликованных данных.
    • Ваша Модель должна подтвердить себя.
    • Ваш контроллер должен прочитать, действительна ли модель.
    • Если модель действительна, сохраните ее в своей базе данных. Перенаправьте на /show, чтобы отобразить представление show для вашего объекта.
    • Если модель недействительна, сохраните значения формы и сообщения об ошибках в TempData и снова перенаправьте на действие New. Заполните поля формы данными из TempData и покажите сообщения об ошибках.

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

person Lance Fisher    schedule 13.08.2008
comment
Лэнс, относится ли сегмент TempData к этому запросу? Очевидно, это создало бы проблемы, если бы он был основан на сеансе и несколько запросов пытались сохранить данные в одном и том же сегменте. Кроме того, является ли использование TempData взломом? Это то, как другие фреймворки MVC решают проблему? - person Ben Mills; 15.08.2008
comment
Отличное резюме! Будет здорово с примером - person Cherian; 09.04.2009
comment
Хорошее резюме! Единственная проблема, которую я обнаружил, заключается в том, что я хочу иметь возможность проверить тип данных, и я не могу сделать это перед передачей данных формы в модель, поскольку при ее создании будут возникать исключения. Есть ли хороший способ обойти это? - person bobwah; 19.04.2009
comment
TryUpdateModel() возьмет данные вашей формы и попытается поместить их в ваш объект. Просто используйте FormData в качестве параметра для вашего контроллера, а не типа объекта. Другим вариантом было бы создание пользовательского связывателя модели. Подробнее здесь: hanselman.com/blog/ - person Lance Fisher; 20.04.2009

Насколько я могу судить, все все еще пытаются найти «стандартный» способ сделать это. Тем не менее, обязательно ознакомьтесь с последними сообщениями Фила Хаака и Скотта Гатри о MVC, и вы найдете интересную информацию о том, как они это сделали. Когда я просто играл с ним для себя, я создал ModelBinder для класса данных LinqToSql, который я создал. Вы можете проверить этот пост, чтобы узнать, как собрать базовый ModelBinder:

ASP.Net MVC Model Binder

В вашем действии, если вы создали ModelBinder "Product", вы просто объявите действие следующим образом:

общедоступный ActionResult New (Product product)

И связыватель модели позаботится о назначении размещенных данных свойствам объектов, если вы все равно правильно их построили.

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

(ModelStateDictionary_name).AddModelError("form_element_id", "entered_value", "error_message");

Затем вы можете просто добавить ‹%= Html.ValidationSummary() %> в свое представление, чтобы отобразить все ваши ошибки.

Для проверки на стороне клиента я просто использовал jQuery. После того, как вы настроите базовый образец, вы можете начать делать некоторые интересные вещи, комбинируя все это с частичными представлениями и вызовами Ajax.

person Switters    schedule 19.09.2008

Вы взглянули на это? http://www.codeplex.com/MvcValidatorToolkit

Цитата со страницы

Набор инструментов Validator Toolkit предоставляет набор средств проверки для новой платформы ASP.NET MVC для проверки форм HTML на стороне клиента и сервера с использованием наборов проверки.

Я боюсь, что кому-то более подкованному в MVC, чем мне, придется говорить о том, где в архитектуре вы должны размещать вещи.

person Pete    schedule 13.08.2008
comment
Я взглянул на проект CodePlex, но то, что я увидел (в то время), меня не впечатлило. Может быть, сейчас лучше. Я посмотрю еще раз. Очевидно, что Джефф и его команда должны проверять данные формы в StackOverflow. Когда я смотрю на HTML-код страницы Задать вопрос, мне кажется, что страница отправляет сообщение самой себе. Интересно, как они реализуют проверку. - person Ben Mills; 14.08.2008

Я тоже только изучаю структуру MVC, поэтому я не уверен, насколько это не так, но, насколько я понимаю, у вас будет форма в представлении, например Edit.aspx. Затем эта форма отправит контроллер другому методу действия, например Update(), передав содержимое формы, которое вы задали в Edit.aspx в качестве параметров.

Update(int id, string name, string foo)

Вы можете выполнить проверку в рамках этого метода. Если все в порядке,

return View("Item", yourObject)
person Iain Holder    schedule 13.08.2008

Существует Castle.Components.Validator в проекте Castle. Он очень маневренный и мощный. Он генерирует правила проверки на основе атрибутов модели (или любого другого источника) и даже может генерировать проверку JS с использованием jQuery, проверки прототипа, fValidate и других. Конечно, разумно абстрагировать валидатор от интерфейса IValidationEngine.

person Artem Tikhomirov    schedule 22.08.2008