在每个控制器的每个动作中,我想检查一下,在某些情况下,会将应用程序返回给另一个控制器/动作。我希望检查尽可能简单,例如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必须返回?
答案 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方法并在其中添加逻辑。如果您只需要一个特定控制器的退出逻辑,那么这比自定义属性更有意义。