2010-12-10 3 views
0

내 컨트롤러의 초기화 함수에서 호출 할 함수를 결정할 수 있기를 원합니다. 예를 들어 경로에서 Controller:MyFunction이 호출되어야한다고 지시하는 경우 Initialize 함수에서 해당 값을 재정의하고 MyFunction2을 호출합니다. 이것을 어떻게 할 수 있습니까?MVC : 컨트롤러 초기화 함수 내에서 새 함수로 리디렉션 요청

여기 왜 내가 필요한지에 대한 더 나은 이해를 얻으려면 현재 시나리오가 필요합니다.

고객 담당자가 있습니다. 고객은 제품 목록을 가지고 있습니다. 고객에게 특정 제품이있는 경우 추가 탐색 요소를 추가하고 새 기능을 처리 할 수 ​​있기를 원합니다. 그래서 여기에 의사 코드에

Receive request 
Check if request matches any specialisation classes we have 
If (match) then call SpecialClass::SpecificRequestFunction 

나는 모든 고객의 물건을 다루는 표준 고객 컨트롤러가 있지만이 방식으로 작동 거라고 어떻게 생각하고있다 나는 그 제품에 대한 전문성을 필요로하는 경우 I 해당 코드를 재사용 할 수있는 모든 이점을 지닌 고객 컨트롤러를 계속 사용할 수는 있지만 전문 기능을 추가 할 수 있습니다.

나는 이것이 의미가 있기를 바랍니다.

답변

3

당신이 할 수있는 몇 가지 방법이 당신이 할 수있다 :

1.Override 컨트롤러의 OnActionExecuting 방법 :

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    base.OnActionExecuting(filterContext); 

    if (filterContext.ActionDescriptor.ActionName == "About") 
     filterContext.Result = RedirectToAction("Index"); 
} 

2.Create 상기와 본질적으로 같은 ActionFilter (, 거기 또한 OnActionExecuting 메서드를 재정의

3.Create 요청이 적합한 컨트롤러에 도달하기 전에 조건부 검사를 할 수있는 경로 제약 조건 :.

,691을
public class IsLocalRouteConstraint : IRouteConstraint 
{ 
    public bool Match(HttpContextBase context, Route route, string paramName, RouteValueDictionary dict, RouteDirection direction 
    { 
    return context.Request.IsLocal; 
    } 
} 

지정된 작업에 대해서는 네비게이션 항목을 추상화하는 것이 좋습니다.

public interface INavigationalItem 
{ 
    string Name { get; } 
    string Controller { get; } 
    string Action { get;} 
    object Parameters { get; } 
} 

그런 식으로 당신이 제공 할 수있는 현재 사용자의 상태에 따라 빌드 IEnumerable<INavigationalItem>. 그런 식으로 추가 컨트롤러를 전문화 할 필요는 없으며 대신 동적으로 사용 가능한 탐색 항목을 작성하십시오.

+0

Ahh looks perfect !!! 한 가지 질문 : 'RedirectToAction'이 실제로 사용자를 리디렉션합니까 아니면 단순히 새 액션을 호출합니까? 이 모든 과정에서 URL이 정확히 동일하게 유지되기를 바랍니다. 감사합니다 – Chris

+0

RedirectToAction은 실제로 URL을 그대로 유지하는 것과 달리 URL을 리디렉션합니다.이 문제를 어떻게 해결합니까? – Chris

+0

옵션 3 (컨트롤러에 도달하기 전에 요청을 가로 채기)을 수행하거나 원래 경로의 동작 내에서 작업을 실행하여이 문제를 해결할 수 있습니다. –

2

이러한 기능을 사용하면 경로에서 호출 할 것입니다 작업 얻을 수있는 컨트롤러 행동 경우 :

protected override void Initialize(RequestContext requestContext) 
{ 
    base.Initialize(requestContext); 
    string action = requestContext.RouteData.GetRequiredString("action"); 
} 

가 있지만, 요청이 이미 첫 번째 작업으로 제작 되었기 때문에 당신이 그것을 무시할 수 없습니다. 또한 왜 다른 액션이 필요하다는 것을 알았을 때이 컨트롤러 액션을 처음에 호출하는 이유는 무엇입니까?

+0

감사합니다. Darin - 나는 내가 쓴 것에 대한 더 나은 설명을 제공하기 위해 내 질문을 업데이트했습니다. – Chris