1

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

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

所以我想做类似的事情

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

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

4

2 回答 2

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从 ACTION 方法返回,就可以将其用作您的ApplyRules()或任何其他方法的返回参数。

如果您的ApplyRules()方法在 Controller 之外,则不能使用RedirectToActionhelper。在这种情况下,您可以RedirectToRouteResult像这样生成:

var routeValues = new System.Web.Routing.RouteValueDictionary();
routeValues.Add("controller", "Account");
routeValues.Add("action", "Register");
var result = new RedirectToRouteResult(routeValues);
于 2013-03-07T21:31:51.723 回答
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")););
   }
}

在此 msdn 帖子中了解有关元组的更多信息。

您当然会进行重定向,如下所示:

public void DoMyRedirect(Tuple<string,string> route)
{
  return RedirectToAction(route.Key1, route.Key2);
}
于 2013-03-07T21:19:34.407 回答