在不发送重定向的情况下使用Controller和Action

本文关键字:Controller Action 情况下 重定向 | 更新日期: 2023-09-27 18:02:55

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

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

所以我想输入

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

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

在不发送重定向的情况下使用Controller和Action

您可以使用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()方法在控制器之外,你不能使用RedirectToAction助手。在这种情况下,可以像这样生成RedirectToRouteResult:

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

我通常不使用元组,但这可能是有意义的情况:

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);
}