使用RedirectToAction打破控制器/操作

时间:2013-08-02 15:40:54

标签: asp.net-mvc-4

在每个控制器的每个动作中,我想检查一下,在某些情况下,会将应用程序返回给另一个控制器/动作。我希望检查尽可能简单,例如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原来的Action必须返回?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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