2010-12-09 4 views
1

고객 제품, 정보 및 기타 사항을 다루는 고객 컨트롤러가 있습니다. 일부 제품에는 약간 다르게 처리하려는 특수화가 있으므로 그렇게하는 과정이 필요합니다. 현재 고객이 해당 제품을 가지고 있는지 확인하기 위해 if 명세서에 하드 코딩되어 있습니다. 그렇다면 여분의 탐색 요소 등을 추가 할 것입니다.MVC - 특정 상황에서 다른 컨트롤러 사용

더 나은 방법이라고 생각되는 것은 내 고객 컨트롤러를 상속하지만 추가 기능을 추가하는 컨트롤러. 요청을 받으면 어떤 고객 파생 컨트롤러가 요청과 일치하는 기능 (예 : ViewSpecialProduct)을 가지고 있는지 확인한 다음 바닐라 고객 컨트롤러와 대조적으로이를 호출 할 수 있다면 꽤 멋지게 될 것입니다.

더 쉬운 방법이 있습니까? 위의 방법을 수행하지 않으면 어떻게됩니까? 아직 경로와 컨트롤러 초기화 프로세스에 대해서는 충분히 알지 못합니다.

감사

+0

chris ** if 문 ** 컨트롤러 동작의 일부 또는보기에 포함되어 있습니까 ?? –

+0

안녕하세요 짐. 현재 컨트롤러의 일부로 사용됩니다. 특정 제품을 선택하면보기로 전송되는 새로운 탐색 요소가 만들어집니다. 그러나 그것들을 제어하는 ​​함수는 현재 주 제어기의 일부이며 다른 제어기의 일부가되어야한다고 생각합니까? – Chris

+1

좋습니다. 'specialties'제품이 ** 사전에 알려진 ** 시나리오 인 경우 해당 추가 하위 클래스에 대한 인터페이스를 만들 수 있습니다. 제품 오브젝트를 채우는 경우, 구체적인 구현이 아닌 적절한 인터페이스를 사용하여 제품을 정의하십시오. 이를 통해 컨트롤러 작업 내에서 다양한 제품 구현을 처리하는 방법을 결정할 수있는 인터페이스 관련 부분 뷰 및/또는 로직을 가질 수 있습니다. 나는 단일 컨트롤러를 고집하지만 인터페이스 구현을 필요에 따라 다룰 것이다. –

답변

1

당신은 DefaultControllerFactory에서 유래와 GetControllerInstance을 재정의하는 새로운 컨트롤러 공장을 만들 수 있습니다. 그런 다음 ControllerBuilder.Current를 통해 Global.asax에 위해 Application_Start의 새로운 ControllerFactory을 설정

public class CustomControllerFactory : DefaultControllerFactory 
{ 
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     if (controllerType == typeof(DefaultProductController)) 
     {     
      if(// is special customer) 
       return new SpecialProductController(); 
      else 
       return new DefaultProductController(); 
     } 
    } 
} 

:

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     ControllerBuilder.Current.SetControllerFactory(new CustomControllerFactory()); 

     RegisterRoutes(RouteTable.Routes); 
    } 
+0

이것은 내가 ' 후에 - 고마워. 일단 내가 뭔가를 가지고 있다면 다시보고 할께. – Chris

+0

나는 이것이 나를 도와 준다고 생각한다. 감사. 귀하의'GetControllerInstance' implementaiton은 끝에는 반환 값이 없습니다 :'return base.GetControllerInstance (requestContext, controllerType);' – tig

0

때문에 난 당신이 고객의 검사를 수행하고 있지만 다음과 같이 보일 수있는 방법을 잘 모르겠어요 라이프 사이클에서 어디에서 발생하는지에 관해서는 라우팅을 통해이를 수행하고 싶지 않을 것입니다. MvcContrib에는 SubController http://jeffreypalermo.com/blog/mvccontrib-latest-release-now-with-subcontroller-support/에 사용할 수있는 코드가 있습니다. 또한 컨트롤러에 컨트롤러 팩터 리 참조를 삽입하거나 컨트롤러를 수동으로 생성하고 해당 액션을 반환하여 다른 컨트롤러를 만들 수도 있습니다 (그러나이 작업을 원할 경우 ControllerContext로 초기화해야 함)).

관련 문제