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

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

Ответов (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

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

Связыватель модели ASP.Net MVC

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

public ActionResult New (продукт)

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

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

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

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

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

Вы смотрели на это? http://www.codeplex.com/MvcValidatorToolkit

Цитируется со страницы

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

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

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

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

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

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

Update(int id, string name, string foo)

Вы можете провести валидацию с помощью этого метода. Если все в порядке,

return View("Item", yourObject)

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