2013-08-23 31 views
8

正しくリダイレ​​クトされないActionFilterAttriuteに問題があります。私は完全なコードベースに精通していませんが、何が起こっているのか分からないほど十分に見てきました。コードをsimplyfyするActionFilterAttributeがリダイレクトされない

、私は関係ない部分を削除した:

public class ResolveApplicationRedirectAttribute : ActionFilterAttribute 
{ 
    //some variables 
    private ActionExecutingContext _filterContext; 

    protected string ApplicationRedirectUrl 
    { 
     get { return ConfigurationManager.AppSettings["ApplicationRedirectUrl"]; } 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     _filterContext = filterContext; 

     //a lot of logic that decide if we should redirect or not 

     //I added this after the other logic to make it always redirect regardless of what happens inside the logic above 
     _filterContext.Result = new RedirectResult(ApplicationRedirectResult); 
    } 
} 

[ResolveApplicationRedirect] 
public ActionResult Index(CrmQueryStringParameters crmParameters){ 
    //some logic 
} 

これは通常動作しますが、アプリケーションを短時間でいくつかの要求に見舞わ取得したときに、インデックスの方法はされて終わりますビューに一部のデータが欠落しているため(データが欠落していることがわかっています)、リダイレクトする必要があります。

しかし、今度は、メソッドの最後の行に_filterContext.Result = new RedirectResult(ApplicationRedirectResult)を追加しましたが、それでも私のActionメソッドを呼び出すことは可能でしょうか?

MVCがfilterContextに入れたRedirectResultを無視してアクションメソッドを起動させる原因となる既知のバグやコーナーケースなどがありますか?

最後の行としてfilterContext.Resultを設定しても問題を引き起こす可能性がある、OnActionExecutingのロジック内にある特殊なものは何でもあります。属性内の例外はすべて吹き飛ばすだけで、属性をスキップしてActionメソッドを呼び出す必要はありません。

正しい方向に私を指す助けがあれば、ここで感謝します。

+0

MVCのソースコードを見ると、ActionExecutingContextを渡すフィルタでOnActionExecutingを実行するメソッドInvokeActionMethodFilterが表示されます。 null以外のResult値が返された場合は、アクションを呼び出すことをスキップしてActionExecutedContextを返します。だから、あなたが見ていることは不可能ではありません。したがって、唯一の問題はResultのnull値になる可能性があります。あなたのロジックをすべてコメントし、最後の行だけを残しておけば、あなたのリダイレクトは動作していますか? –

答えて

0

最後に問題が見つかりました。これは、クラス変数_filterContextの使用に関連していました。

問題は、MVC ではなく、リクエストごとにフィルタの新しいインスタンスを作成して、属性の同じインスタンスを共有する要求が複数発生することです。

詳細については、壊れた変更の一覧in the MVC3 release notesを参照してください。

0

+1 Wouterの結果。あなたが示したコードがあれば、あなたが記述した結果を達成することはできません。おそらく// magic logic hereはヌルを返すでしょう_filterContext.Result

関連する問題