我有一些运行某些规则的服务器端代码,而不是根据规则的结果重定向到不同的控制器和操作。
什么是表示Controller和Action组合而不执行RedirectToAction("Action","Controller");
的最好方法,因为我实际上并不想在方法执行后立即发出重定向。
所以我想做像
这样的事情public SomeObject ApplyRules(){
if(somecondition){
return(Action1,Controller1);
else if(someotherCondition){
return(Action2,Controller2);
}
}
我可以创建一个具有两个字符串属性(Controller
和Action
)的类,但我必须认为我应该使用一些内置类来表示它。
答案 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);
}