在不发送重定向的情况下使用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
),但我必须认为有一些内置的类,我应该用它来表示这个
您可以使用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);
}