2013-03-07 72 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); 
} 
相关问题