【问题标题】:Using RedirectToAction to break out of a controller/action使用 RedirectToAction 打破控制器/动作
【发布时间】:2013-08-02 15:40:54
【问题描述】:

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

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

public ActionResult Partial()
{
    TestForExit( );
    ...
    return PartialView( "ViewPartial", data );
}

如果 TextForExit 返回 RedirectToAction( "Index", "Home" ) 我必须有这样的东西:

public ActionResult Partial()
{
    var result = TestForExit( );
    if( result == null )
    {
        ...
        result = PartialView( "ViewPartial", data );
    }
    return result;
}

但是,由于我将在任何地方都有这个,我真的希望 TestForExit( ) 本身能够将我发送到 Home/Index,而不是返回我的 Action 必须返回的 ActionResult。

换句话说,我怎样才能让 TestForExit 实际转到 Home/Index,而不是只返回原始操作必须返回的 ActionResult

【问题讨论】:

    标签: asp.net-mvc-4


    【解决方案1】:

    您将需要使用自定义 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(new TextForExitActionFilterAttribute())

    这里有一些相关链接。

    Redirecting to specified controller and action in asp.net mvc action filter

    http://www.asp.net/mvc/tutorials/hands-on-labs/aspnet-mvc-4-custom-action-filters

    【讨论】:

    • 谢谢。尽管我选择了适合这种特殊情况的不同答案,但我将保留此作为参考。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      好吧,你的控制器动作方法最终必须返回,所以无论动作是否执行,你仍然必须返回一个 ActionResult。

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

      然后在您的操作过滤器中,检查您的退出条件并在必要时重定向。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-19
        • 2022-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多