Сначала немного контекста (потому что я знаю, что вы все любите это!):
У меня есть модель под названием Примечание . В нем есть поле с именем Тип , которое в базе данных является целочисленным значением, которое указывает, к какому типу объектов относится данная заметка (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 () . Какой лучший способ сделать это в обоих методах без дублирования кода?