Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从基本控制器中执行的OnAction重定向?_C#_Asp.net Mvc_Onactionexecuting - Fatal编程技术网

C# 如何从基本控制器中执行的OnAction重定向?

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

我尝试了两种方法:Response.Redirect()不执行任何操作,以及在基本控制器内调用一个新方法,该方法返回ActionResult并使其返回RedirectToAction()。。。这两种方法都不管用


如何从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-in
OnActionExecuting
方法来检查请求是否来自同一控制器,如果是,则不要再次重定向它的登录操作。代码如下:

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{{“控制器”、“帐户”}、{“操作”、“登录”}};}