使用Controller和Action而不发送重定向?

时间:2013-03-07 20:58:49

标签: c# asp.net-mvc-3

我有一些运行某些规则的服务器端代码,而不是根据规则的结果重定向到不同的控制器和操作。

什么是表示Controller和Action组合而不执行RedirectToAction("Action","Controller");的最好方法,因为我实际上并不想在方法执行后立即发出重定向。

所以我想做像

这样的事情
public SomeObject ApplyRules(){
   if(somecondition){
      return(Action1,Controller1);
   else if(someotherCondition){
      return(Action2,Controller2);
   }
}

我可以创建一个具有两个字符串属性(ControllerAction)的类,但我必须认为我应该使用一些内置类来表示它。

2 个答案:

答案 0 :(得分: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();
}

只要您不从ACTION方法返回RedirectResult,就可以将其用作ApplyRules()的返回参数或任何其他方法。

如果您的ApplyRules()方法不属于Controller,则无法使用RedirectToAction帮助程序。在这种情况下,您可以像这样生成RedirectToRouteResult

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

答案 1 :(得分: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);
}