Я играл с ASP.NET MVC Framework, и одна вещь, которая меня действительно смущает, - это то, как я должен выполнять проверку отправленных данных формы на стороне сервера. Я предполагаю, что я не отправляю обратно на тот же URL-адрес, но если я этого не сделаю, как мне повторно отобразить форму с введенными данными и сообщениями об ошибках? Кроме того, куда должна идти логика проверки? В модели или контроллере? Кажется, это одна из немногих областей, где веб-формы намного сильнее (мне не хватает элементов управления проверкой).
Проверка опубликованных данных формы в среде ASP.NET MVC
Ответы (6)
Возможно, вы захотите взглянуть на последний пост ScottGu для ASP.Net prev 5. Он проходит через очень интересный пример проверки:
Вот обзор потока в MVC:
- /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 планирует структуру проверки для следующего предварительного просмотра.
Насколько я могу судить, все все еще пытаются найти «стандартный» способ сделать это. Тем не менее, обязательно ознакомьтесь с последними сообщениями Фила Хаака и Скотта Гатри о MVC, и вы найдете интересную информацию о том, как они это сделали. Когда я просто играл с ним для себя, я создал ModelBinder для класса данных LinqToSql, который я создал. Вы можете проверить этот пост, чтобы узнать, как собрать базовый ModelBinder:
В вашем действии, если вы создали ModelBinder "Product", вы просто объявите действие следующим образом:
общедоступный ActionResult New (Product product)
И связыватель модели позаботится о назначении размещенных данных свойствам объектов, если вы все равно правильно их построили.
После этого в вашем методе GetValue() вы можете реализовать любую проверку, которую хотите, будь то использование исключений, регулярных выражений или что-то еще, что вы можете сделать, например:
(ModelStateDictionary_name).AddModelError("form_element_id", "entered_value", "error_message");
Затем вы можете просто добавить ‹%= Html.ValidationSummary() %> в свое представление, чтобы отобразить все ваши ошибки.
Для проверки на стороне клиента я просто использовал jQuery. После того, как вы настроите базовый образец, вы можете начать делать некоторые интересные вещи, комбинируя все это с частичными представлениями и вызовами Ajax.
Вы взглянули на это? http://www.codeplex.com/MvcValidatorToolkit
Цитата со страницы
Набор инструментов Validator Toolkit предоставляет набор средств проверки для новой платформы ASP.NET MVC для проверки форм HTML на стороне клиента и сервера с использованием наборов проверки.
Я боюсь, что кому-то более подкованному в MVC, чем мне, придется говорить о том, где в архитектуре вы должны размещать вещи.
Я тоже только изучаю структуру MVC, поэтому я не уверен, насколько это не так, но, насколько я понимаю, у вас будет форма в представлении, например Edit.aspx. Затем эта форма отправит контроллер другому методу действия, например Update(), передав содержимое формы, которое вы задали в Edit.aspx в качестве параметров.
Update(int id, string name, string foo)
Вы можете выполнить проверку в рамках этого метода. Если все в порядке,
return View("Item", yourObject)
Существует Castle.Components.Validator в проекте Castle. Он очень маневренный и мощный. Он генерирует правила проверки на основе атрибутов модели (или любого другого источника) и даже может генерировать проверку JS с использованием jQuery, проверки прототипа, fValidate и других. Конечно, разумно абстрагировать валидатор от интерфейса IValidationEngine.