2013-12-27 19 views
5

私のコントローラのほとんどのアクションでは、条件が満たされているかどうかを確認し、同じコントローラ内の別のアクションにリダイレクトしないと、試してみる必要があります:メソッド内からのアクションへのリダイレクト

public ActionResult Transactions() 
    { 
     GrossGalsConfermation(); 
     return View(); 
    } 

    public void GrossGalsConfermation() 
    { 
     if (Session["HasConfirmed"] == null && TerminalUserData.IsGrossGallonTerminal) 
     { 
      RedirectToAction("ConversionFactors"); 
     } 
    } 

しかし、if文が真の場合でも、RedirectToActionは実行されません。私はVSでデバッグを行っており、ActionからMethodにジャンプし、IFの文を評価してRedirectToActionを実行しますが、それは呼び出し元のAcationに戻り、戻ります。それを強制的にリダイレクトすることはできますか?私が似たような問題を見つけたので、解決策はvoidからActionResultに変更されましたが、このMethodは何十回も表示されるので、復帰するためには、フォールバックActionを返さなければなりません。

+0

?それはアクションにリダイレクトされますか? – IanAuld

+0

@IanAuldブラウザがリダイレクトされるようにするには、 'RedirectToRouteResult'を*返す必要があります。 –

+0

アクションフィルタの代わりにヘルパーメソッドを使用しているようです... –

答えて

5

すべてRedirectToActionが返されます。RedirectToRouteResult - 実際に返さない限り、ブラウザはリダイレクトされません。あなたはあなたのメソッド内でこれをしたくないので(がnullを返し、あなたのアクションでヌルチェックをしますが、それは不器用です)、代わりにアクションフィルタを使用することをお勧めします。次のようなものは、それを行うだろう:

public class GrossGalsFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (Session["HasConfirmed"] == null 
            && TerminalUserData.IsGrossGallonTerminal) 
     { 
      filterContext.Result = 
       new RedirectToRouteResult(new RouteValueDictionary(new 
       { controller = "MyController", action = "ConversionFactors" })); 
     } 

     base.OnActionExecuting(filterContext); 
    } 
} 

その後、あなたのコントローラのアクションを飾る:あなたはTerminalUserData.IsGrossGallonTerminalのホールドを取得するには、フィルタを変更する必要があり

[GrossGalsFilter] 
public ActionResult MyControllerAction 

注 - これはどこから来るのか知ることは不可能にあなたの質問に基づいてアクションフィルタの

より:http://msdn.microsoft.com/en-us/library/dd381609(v=vs.100).aspxあなたは `if`を取る場合はどうなりますか

+0

ありがとう、私はアクションフィルタについて考えていませんでした。私が月曜日に仕事に戻るとき、私はアクションフィルタに変換し、それがどのように動作するかを見ます。 – Matthew

+0

私は今日これを見ていて、元々どのコントローラーが呼び出されたのかわかるだろうと思っていました。そのため、ConversionFactorsビューで必要な手順を完了した後でそれらを返すことができます。私はそれが元の要求ではなかったことを知っていますが、私は今それを実現しました(より適切であればこれを別の質問にすることができます) – Matthew

+0

最も簡単な方法は、GETパラメータとしてリダイレクトにリターンURLを追加することです。 UrlHelperをインスタンス化して、適切なURLを動的に取得できます。 –

1

あなたは「リターン」欠けている:

return RedirectToAction(...); 

あなたがメソッドを複数回再利用したい場合は、フィルタを書くになるはずです。

+0

質問を完全に読んでください。 *同様の問題が見つかったため、解決策がvoidからActionResultに変更されましたが、このメソッドは何十ものビューから呼び出されるため、戻すための代替アクションを用意する必要があります。* –

+0

ActionResultを返す。 –

+0

あなたの答えは質問に対処していません。 –

-1

あなたのGrossGalsConfirmation()(私はe btwではありません)は何も返しません。戻り値の型をActionResultに変更し、RedirectToActionを返します。

+0

OPから:私は似たような問題を発見し、解決策はvoidからActionResultに変更することでしたが、このメソッドは何十ものビューから呼び出されるため、復帰するための代替アクションを用意する必要があります。 – Matthew

関連する問題