Как проверить этот сценарий в ASP.NET MVC? - PullRequest
2 голосов
/ 23 января 2009

Сначала немного контекста (потому что я знаю, что вы все любите это!):

У меня есть модель под названием Примечание . В нем есть поле с именем Тип , которое в базе данных является целочисленным значением, которое указывает, к какому типу объектов относится данная заметка (1 = Клиент, 2 = Торговый запрос и т. Д.). Второе поле с именем Источник обозначает идентификатор конкретного объекта, к которому относится данная заметка.

Например, если бы я хотел добавить примечание к Клиенту № 34, я бы установил Тип на 1 и Источник на 34.

Чтобы сделать вещи немного более читабельными, у меня есть Enum с именем DataObjectType , который содержит сопоставление для каждого из возможных Тип целочисленных значений с понятным именем. Так, например, DataObjectType.Customer совпадает со значением 1 в поле Тип .

Далее у меня есть собственный маршрут:

/Notes/New/{type}/{id}

и два действия контроллера для создания новой заметки:

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult New(DataObjectType type, int id) {
    Note note = new Note { Type = type, Source = id };
    return View(note);
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Note note) {
    // This is just an example
    note.Persist();
    return View("New", note);
}

Прежде всего, мне нужно убедиться, что значение, предоставленное для значения маршрута {type} , действительно для перечисления DataObjectType . Можно ли это сделать с помощью ограничения маршрута? На данный момент аргумент типа New () будет принимать любое целое число, независимо от того, существует оно в DataObjectType или нет.

Во-вторых, мне нужно убедиться, что объект, к которому пользователь пытается добавить заметку, действительно существует в базе данных, прежде чем показывать форму «Новая заметка». Я мог бы легко сделать это в методе New () , но может прийти время, когда пользователь отправит данные непосредственно в Create () , даже не посетив New () . В таком случае мне также нужно убедиться, что объект существует в методе Create () . Какой лучший способ сделать это в обоих методах без дублирования кода?

Ответы [ 2 ]

1 голос
/ 23 января 2009

Вы правы в том, что действия New и Create должны гарантировать, что им передана действительная модель. Правильное место для этого в подшивке модели. Связыватель модели должен добавить ошибку состояния модели, если передан недопустимый объект (или Id). Вероятно, при создании и создании новых могут использоваться одни и те же подшивки (и) модели.

Не путайте ограничения маршрута с проверкой пользовательского ввода. Ограничения маршрутов просто помогают системе маршрутизации найти подходящий маршрут, когда вы сами не указываете маршрут (т.е. когда вы используете Html.ActionLink вместо RouteLink). Если вы используете именованные маршруты, и вы должны это сделать, тогда ограничение не нужно для поиска подходящего маршрута, потому что вы указали маршрут напрямую. Ограничения маршрутов предназначены для предотвращения выбора определенного маршрута для действий, которые он не предназначен для обработки, и не являются местом для проверки ввода пользователя.

Функция, которую вы запрашиваете, является своего рода проверкой пользовательского ввода, даже если рассматриваемый пользовательский ввод находится в URL. Если вы собираетесь выйти за рамки этого простого, единственного случая, вам может понадобиться использовать среду проверки, так как это значительно упростит другие виды проверки. Вот тот, который мне интересен .

1 голос
/ 23 января 2009

При настройке ваших маршрутов есть параметр, который вы можете использовать для указания ограничений (выполняется через Regex). Вы можете использовать это для ограничения идентификатора там, но вам придется создать отдельный маршрут для этого сценария, потому что вы не хотите, чтобы все «идентификаторы» фильтровались по этому правилу.

Кроме того, вы можете просто поставить эту проверку в начале действия вашего контроллера.

Что касается гарантии того, что заметка уже существует в БД, я не вижу возможности прикрепить чек в начале действия Создать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...