2013-08-02 38 views
1

在每個控制器的每個操作中,我想要檢查在某些情況下會將應用程序返回到另一個控制器/操作。我想檢查以儘可能簡單,像TestForExit();使用RedirectToAction突破控制器/操作

這裏是我的問題:我所有的行動回報ActionResult,這裏是一個示例:

public ActionResult Partial() 
{ 
    TestForExit(); 
    ... 
    return PartialView("ViewPartial", data); 
} 

如果TextForExit返回RedirectToAction("Index", "Home")我必須有是這樣的:

public ActionResult Partial() 
{ 
    var result = TestForExit(); 
    if(result == null) 
    { 
     ... 
     result = PartialView("ViewPartial", data); 
    } 
    return result; 
} 

但是,正如我將這個無處不在,我真的很想有TestForExit()本身能送我去主頁/指數,而不是返回一個法案ionResult,我的行動必須返回。

換句話說,我該如何讓TestForExit ACTUALLY進入Home/Index,而不是僅僅返回原始Action必須返回的ActionResult

回答

0

或者,您可以直接在控制器類中重寫OnActionExecuting方法,並在其中添加邏輯。如果你只需要一個特定控制器的退出邏輯,這將比自定義屬性更有意義。

1

你會想要使用自定義的ActionFilter。您可以全局應用此操作篩選器。然後在OnActionExecuting中,您可以執行TestForExit檢查,並根據需要重定向。

例如。

public void TestForExitActionFilterAttribute : ActionFilterAttribute, IActionFilter 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if(TextForExit()) 
     { 
      filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary {{ "Controller", "ExitController" }, 
              { "Action", "ExitAction" } }); 
     } 

     base.OnActionExecuting(filterContext); 
    } 
} 

現在申請您的[TestForExitActionFilter]屬性到你的控制器,或者個人的行爲。或者,要將它添加到任何地方,請將以下行添加到FilterConfig.RegisterGlobalFiltersfilters.Add(new TextForExitActionFilterAttribute())

這是一些相關的鏈接。

Redirecting to specified controller and action in asp.net mvc action filter

http://www.asp.net/mvc/tutorials/hands-on-labs/aspnet-mvc-4-custom-action-filters

+0

謝謝。儘管我選擇了適合於這種特殊情況的不同答案,但我會將其作爲參考。 –

0

嗯,你的控制器的操作方法有最終迴歸,所以你還是要回到一個ActionResult不管是什麼執行的操作。

如果您想避免將代碼添加到每個操作中,您可以考慮創建一個custom Action Filter,然後使用該過濾器標記您的操作,或者在每次操作時應用全局過濾器。

然後在您的操作篩選器中,檢查退出條件並在必要時重定向。