C# 如何从基本控制器中执行的OnAction重定向?
我尝试了两种方法:Response.Redirect()不执行任何操作,以及在基本控制器内调用一个新方法,该方法返回ActionResult并使其返回RedirectToAction()。。。这两种方法都不管用C# 如何从基本控制器中执行的OnAction重定向?,c#,asp.net-mvc,onactionexecuting,C#,Asp.net Mvc,Onactionexecuting,我尝试了两种方法:Response.Redirect()不执行任何操作,以及在基本控制器内调用一个新方法,该方法返回ActionResult并使其返回RedirectToAction()。。。这两种方法都不管用 如何从OnActionExecuting方法执行重定向?也可以这样做: public override void OnActionExecuting(ActionExecutingContext filterContext) { ... if (needToRedir
如何从OnActionExecuting方法执行重定向?也可以这样做:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
...
if (needToRedirect)
{
...
filterContext.Result = new RedirectResult(url);
return;
}
...
}
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{"controller", "Home"},
{"action", "Index"}
}
);
创建一个单独的类
public class RedirectingAction : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
base.OnActionExecuting(context);
if (CheckUrCondition)
{
context.Result = new RedirectToRouteResult(new RouteValueDictionary(new
{
controller = "Home",
action = "Index"
}));
}
}
}
那么,
创建控制器时,将此注释称为
[RedirectingAction]
public class TestController : Controller
{
public ActionResult Index()
{
return View();
}
}
如果重定向的控制器继承自相同的
baseController
,我们将重写OnActionExecuting
方法,从而导致递归循环。假设我们将其重定向到account controller的登录操作,那么登录操作将调用OnActionExecuting
方法,并一次又一次地重定向到相同的登录操作
。。。因此,我们应该应用check-inOnActionExecuting
方法来检查请求是否来自同一控制器,如果是,则不要再次重定向它的登录操作。代码如下:
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
try
{
// some condition ...
}
catch
{
if (filterContext.Controller.GetType() != typeof(AccountController))
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary {
{ "controller", "Account" },
{ "action", "Login" }
});
}
}
}
您也可以使用
新重定向操作(字符串操作,字符串控制器)
,而不是新重定向结果(url)
。这可能是在您发布答案后添加到MVC的。你的解决方案使我走上了正确的道路。@Pluc-onaction首先执行。如果设置了context.Result,那么重定向将在操作执行之前发生。(通过个人测试/调试验证。)@Manfred注意,应该对方法(无new
)RedirectToAction进行赋值:filterContext.Result=RedirectToAction(字符串操作,字符串控制器)代码>@Manfred我只是想补充一点,你不会对RedirectToAction进行更新。它只是filterContext.Result=RedirectToAction(..)名称“RedirectToAction”在当前上下文中不存在??我更喜欢将此匿名对象用于RouteValueDictionary
构造函数,因为它在MVC的其他地方镜像了路由+1try{int CompanyId=UserContext.Company.CompanyId;}catch{if(filterContext.Controller.GetType()!=typeof(AccountController)){filterContext.Result=new RedirectToRouteResult(new RouteValueDictionary{{“控制器”、“帐户”}、{“操作”、“登录”}};}