Предположения
Это удобно для пользователя, чтобы увидеть разные URL-адреса для различных действий в браузере. Например, «/ pages / create» и «/pages/edit/1» .
Для разработчика полезно иметь только одну пару действие + вид для создания и редактирования страниц, поскольку они обычно очень похожи. (Также хорошо иметь один контроллер на объект.)
Решение
Регистрация маршрутов по умолчанию: '{controller} / {action} / {id}'
Мы можем добавить еще два правила перед этим:
{controller} / create (должен указывать на действие «CreateOrEdit»)
{controller} / edit / {id} (также должен указывать на действие «CreateOrEdit»)
Теперь у нас может быть что-то вроде этого:
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute(
name: "Create",
url: "{controller}/create",
defaults: new { controller = "Default", action = "CreateOrEdit" }
);
routes.MapRoute(
name: "Edit",
url: "{controller}/edit/{id}",
defaults: new { controller = "Default", action = "CreateOrEdit" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Default", action = "Index", id = UrlParameter.Optional }
);
}
Так что теперь и запросы на создание и редактирование будут обрабатываться действием 'CreateOrEdit'. Другие пойдут по умолчанию.
Следующее, что мы должны сделать, это добавить действие 'CreateOrEdit' для HttpGet и HttpPost в нашем контроллере:
[HttpGet]
public ActionResult CreateOrEdit(int? id)
{
return this.View(new CreateOrEditViewModelBuilder(this).Build(id));
}
[HttpPost]
public ActionResult CreateOrEdit(CreateOrEditViewModel сreateOrEditViewModel)
{
if (this.ModelState.IsValid)
{
Page page = new CreateOrEditViewModelMapper(this).Map(сreateOrEditViewModel);
if (сreateOrEditViewModel.Id == null)
this.UnitOfWork.GetRepository<IPageRepository>().Create(page);
else this.UnitOfWork.GetRepository<IPageRepository>().Edit(page);
this.UnitOfWork.Save();
return this.RedirectToAction("Index");
}
return this.View(сreateOrEditViewModel);
}
И, наконец, мы должны добавить представление с именем «CreateOrEdit». Мы можем использовать здесь this.Model.Id == null, чтобы узнать, что мы создаем или редактируем.
Результат
Теперь у нас нет повторяющегося кода, и мы можем иметь такие очевидные URL, как этот:
/ pages (чтобы увидеть все страницы)
/ pages / create (создать новую страницу)
/ pages / edit / 1 (для редактирования существующей страницы)
/ pages / delete / 1 (чтобы удалить существующую страницу)
Надеюсь, это кому-нибудь поможет!