2013-03-07 29 views
1

我有一些服務器端代碼運行一些規則,並將根據規則的結果重定向到不同的控制器和操作。使用控制器和動作而不發送重定向?

什麼是最好的方式來代表控制器和行動組合,而不執行RedirectToAction("Action","Controller");,因爲我不真的想在執行方法後發出重定向。

,所以我想這樣做

public SomeObject ApplyRules(){ 
    if(somecondition){ 
     return(Action1,Controller1); 
    else if(someotherCondition){ 
     return(Action2,Controller2); 
    } 
} 

我可以創建有兩個字符串屬性(Controller,和Action)一類,但我認爲有一些內置在課堂上,我應該使用代表這一點。

回答

4

您可以使用RedirectToRouteResult類型,並通過它。您不必創建新的對象或元組。

[NonAction] 
private RedirectToRouteResult ApplyRules(){ 
    if(condition1){ 
     return RedirectToAction("Action1"); 
    } 
    else if(condition2){ 
     return RedirectToAction("Action2"); 
    } 
    else return RedirectToAction("Action3") 
} 

public ActionResult MyAction() 
{ 
    RedirectToRouteResult result = ApplyRules(); 

    // As long as you don't return your "result" from THIS METHOD 
    // redirect won't happen: 

    // return result; 

    return View(); 
} 

只要你不從你的行動方法返回RedirectResult,你可以使用它作爲你的ApplyRules()的返回參數或任何其他方法。

如果您的ApplyRules()方法在控制器之外,則不能使用RedirectToAction幫助程序。在這種情況下,你可以這樣生成RedirectToRouteResult

var routeValues = new System.Web.Routing.RouteValueDictionary(); 
routeValues.Add("controller", "Account"); 
routeValues.Add("action", "Register"); 
var result = new RedirectToRouteResult(routeValues); 
+1

+1這是一個更好的方法。 – 2013-03-07 21:49:17

+0

仍不能解決RedirectToAction(「ActionName); – cobolstinks 2013-03-07 21:54:25

+0

納米代爾不得不延長控制器看起來這是我想要的 – cobolstinks 2013-03-07 21:55:56

1

我通常不使用的元組,但它是有道理的,這可能是一種情況:

public Tuple<string,string> ApplyRules(){ 
    if(somecondition) 
    { 
     return(new Tuple<string, string>("Action1","Controller1")); 
    } 
    else if(someotherCondition) 
    { 
     return(return(new Tuple<string, string>("Action2","Controller2"));); 
    } 
} 

瞭解更多關於在元組this msdn post

你當然會做你的重定向,像這樣:

public void DoMyRedirect(Tuple<string,string> route) 
{ 
    return RedirectToAction(route.Key1, route.Key2); 
} 
相關問題