Asp.net mvc 4 使用RedirectToAction中断控制器/操作

Asp.net mvc 4 使用RedirectToAction中断控制器/操作,asp.net-mvc-4,Asp.net Mvc 4,在每个控制器中的每个操作中,我希望检查在某些情况下是否会将应用程序返回到另一个控制器/操作。我希望检查尽可能简单,比如TestForExit() 我的问题是:我的所有操作都返回ActionResult,下面是一个示例: public ActionResult Partial() { TestForExit( ); ... return PartialView( "ViewPartial", data ); } 如果TextForExit返回redirectoaction

在每个控制器中的每个操作中,我希望检查在某些情况下是否会将应用程序返回到另一个控制器/操作。我希望检查尽可能简单,比如
TestForExit()

我的问题是:我的所有操作都返回
ActionResult
,下面是一个示例:

public ActionResult Partial()
{
    TestForExit( );
    ...
    return PartialView( "ViewPartial", data );
}
如果TextForExit返回
redirectoaction(“Index”,“Home”)

public ActionResult Partial()
{
    var result = TestForExit( );
    if( result == null )
    {
        ...
        result = PartialView( "ViewPartial", data );
    }
    return result;
}
但是,由于我在任何地方都会有这个,我真的希望
TestForExit()
本身能够将我发送到Home/Index,而不是返回我的操作必须返回的ActionResult


换句话说,我怎样才能让TestForExit真正返回主页/索引,而不是仅仅返回原始操作必须返回的
ActionResult
。您可以全局应用此操作筛选器。然后在
OnActionExecuting
中,您可以执行
TestForExit
检查,并根据需要重定向

比如说

public void TestForExitActionFilterAttribute : ActionFilterAttribute, IActionFilter
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if(TextForExit())
        {
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary {{ "Controller", "ExitController" },
                                          { "Action", "ExitAction" } });
        }

        base.OnActionExecuting(filterContext);
    }
}
现在将
[TestForExitActionFilter]
属性应用于控制器或单个操作。或者,要将其添加到所有位置,请将以下行添加到
FilterConfig.RegisterGlobalFilters
filters.add(新文本ForExitActionFilterAttribute())

这里有一些相关链接


您需要使用自定义ActionFilter。您可以全局应用此操作筛选器。然后在
OnActionExecuting
中,您可以执行
TestForExit
检查,并根据需要重定向

比如说

public void TestForExitActionFilterAttribute : ActionFilterAttribute, IActionFilter
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if(TextForExit())
        {
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary {{ "Controller", "ExitController" },
                                          { "Action", "ExitAction" } });
        }

        base.OnActionExecuting(filterContext);
    }
}
现在将
[TestForExitActionFilter]
属性应用于控制器或单个操作。或者,要将其添加到所有位置,请将以下行添加到
FilterConfig.RegisterGlobalFilters
filters.add(新文本ForExitActionFilterAttribute())

这里有一些相关链接


您的控制器操作方法最终必须返回,因此无论操作是否执行,您仍然必须返回ActionResult

如果您希望避免将该代码添加到每个操作中,您可以考虑创建一个过滤器,然后使用该过滤器标记您的操作,或者如果您需要为每个操作应用一个全局过滤器


然后在动作过滤器中,检查退出条件,必要时进行重定向。

控制器动作方法最终必须返回,因此无论动作执行情况如何,都必须返回动作结果

如果您希望避免将该代码添加到每个操作中,您可以考虑创建一个过滤器,然后使用该过滤器标记您的操作,或者如果您需要为每个操作应用一个全局过滤器


然后在动作过滤器中,检查退出条件,必要时进行重定向。

或者,您可以直接在控制器类中重写OnActionExecuting方法,并在其中添加逻辑。如果您只需要一个特定控制器的退出逻辑,那么这比自定义属性更有意义。

或者,您可以直接在控制器类中重写OnActionExecuting方法,并在其中添加逻辑。如果您只需要一个特定控制器的退出逻辑,那么这比自定义属性更有意义。

谢谢。我将保留此作为参考,尽管我选择了一个不同的答案,适合这种特殊情况。谢谢。我将保留这一点作为参考,尽管我选择了一个适合这种特殊情况的不同答案。