2010-12-10 24 views
0

私のコントローラの初期化機能で、呼び出されるWHICH関数を決定したいと思います。たとえば、ルートでController:MyFunctionが呼び出されるように指示されている場合、初期化関数内からその値をオーバーライドし、たとえば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(上記と本質的に同じで、 。

:と

3.Createもあり、要求が適切なコントローラに到達する前に、あなたが条件のチェックを行うことができますルート制約をOnActionExecutingメソッドをオーバーライド

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

指定した作業については、ナビゲーションアイテムを抽象化するとよいでしょう。

あなたは、現在のユーザーの状態に基づいて構築 IEnumerable<INavigationalItem>を提供できる方法
public interface INavigationalItem 
{ 
    string Name { get; } 
    string Controller { get; } 
    string Action { get;} 
    object Parameters { get; } 
} 

。そのような追加のコントローラーを特化する必要はなく、代わりに使用可能なナビゲーション項目を動的に構築します。

+0

ああこれは完璧に見えます! 1つの質問: 'RedirectToAction'は実際にユーザーをリダイレクトしますか、それとも単に新しいアクションを呼び出すのでしょうか?私はこの間にURLがまったく同じになるようにしたい。ありがとう – Chris

+0

URLをそのまま維持するのではなく、RedirectToActionがURLを実際にリダイレクトします。これをどうやって回避しますか? – Chris

+0

これを回避するには、オプション3(コントローラに到達する前にリクエストをインターセプトする)を実行するか、元のルートのアクション内からアクションを実行します。 –

2

それらの機能を使用すると、ルートから呼び出されようとしているアクションを得ることができ、コントローラのアクションをしている場合:

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

が、要求が既に最初のアクションに行われているので、あなたはそれをオーバーライドすることはできません。また、あなたが別のアクションが必要であることを知っているときに、なぜこのコントローラーアクションを最初に呼び出すのですか?

+0

ありがとうダーリン - 私は後に何が良いのかを説明するために質問を更新しました – Chris

関連する問題