Я работаю над новым проектом MVC 5. Это один многоэтажный сайт, который позволяет многим организациям и филиалам поддерживать страницу. Все страницы Начнут со следующим форматом URL:Как вы перегружаете MVC-контроллеры, чтобы избежать повторения общего кода?
http://mysite.com/{organisation}/{branch}/...
Например:
http://mysite.com/contours/albany/...
http://mysite.com/contours/birkenhead/...
http://mysite.com/lifestyle/auckland/...
Я объявил свою RouteConfig с {organisation}
и {branch}
перед {controller}
и {action}
:
routes.MapRoute(
name: "Default",
url: "{organisation}/{branch}/{controller}/{action}/{id}",
defaults: new { controller = "TimeTable",
action = "Index",
id = UrlParameter.Optional });
Это работает отлично. Однако КАЖДЫЙ один контроллер теперь имеет идентичный код в верхней части, который анализирует organisation
и branch
.
public ActionResult Index(string organisation, string branch, string name, int id)
{
// ensure the organisation and branch are valid
var branchInst = _branchRepository.GetBranchByUrlPath(organisation, branch);
if (branchInst == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
// start the real code here...
}
Увлекаюсь СУХОЙ принципе (не повторяться), и мне интересно, если это возможно, чтобы как-то выделить, что общий код и изменить свои подписи контроллера на что-то вроде этого:
public ActionResult Index(Branch branch, string name, int id)
{
// start the real code here...
}
Хорошо, я уже пробовал что-то подобное, но даже после проверки мой 'branchInst' недоступен в контроллере, который наследует от этого. –
Спасибо, это заставило меня задуматься о том, ПОЧЕМУ это работает, и я наконец понял, что объекты Controller на самом деле действительно недолговечные объекты, и мне не нужно было беспокоиться о том, что переменная уровня члена будет использоваться вне контекста. Это сделало контроллер более понятным для меня! –