새로운 MVC 5 프로젝트를 만들고 있습니다. 하나의 멀티 테넌트 사이트로 많은 조직과 지점에서 페이지를 관리 할 수 있습니다. 모든 페이지는 다음과 같은 URL 형식으로 시작 :공통 코드 반복을 피하기 위해 MVC 컨트롤러를 어떻게 오버로드합니까?
http://mysite.com/{organisation}/{branch}/...
예를 들어 :
routes.MapRoute(
name: "Default",
url: "{organisation}/{branch}/{controller}/{action}/{id}",
defaults: new { controller = "TimeTable",
action = "Index",
id = UrlParameter.Optional });
:
http://mysite.com/contours/albany/...
http://mysite.com/contours/birkenhead/...
http://mysite.com/lifestyle/auckland/...
은 내가 {controller}
및 {action}
전에 {organisation}
및 {branch}
내 RouteConfig을 선언했습니다 이것은 잘 작동하고 있습니다. 그러나 모든 단일 컨트롤러는 이제 코드 상단에 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...
}
나는 DRY 원칙에 열중 해요 (자신을 반복하지 않는 것) 어떻게 든 공통 코드를 분리하고이 같은 내 컨트롤러 서명을 변경할 수 있는지 궁금 해요 :
public ActionResult Index(Branch branch, string name, int id)
{
// start the real code here...
}
좋아, 나는 이미 이런 식으로 시도했지만, 유효성을 검증 한 후에도 내 'branchInst'를 상속 한 컨트롤러에서 사용할 수 없습니다. –
감사합니다.이게 내가이 일을하는 이유에 대해 열심히 생각하게 만들었고 마침내 컨트롤러 객체가 실제로는 수명이 짧은 객체라는 사실을 깨달았습니다. 멤버 수준 변수가 문맥 밖으로 사용되지 않을까 걱정할 필요가 없었습니다. 이로 인해 컨트롤러 사용이 훨씬 명확 해졌습니다! –