基于ASP.NET MVC3中的逻辑的全局重定向

时间:2012-02-01 00:16:49

标签: asp.net-mvc-3

我正在构建一个ASP.NET MVC3计算机支持票务门户。

存在维护状态,最好禁止用户与EF /数据库交互,以避免我目前遇到的“冲突”。

每当后台逻辑将门户网站置于该状态时,我有一个IMaintenanceDispatcher,其业务逻辑将布尔属性IsOnMaintenance设置为true。

我需要在维护时将客户端请求重定向到停放页面。

我在哪里放置将检查IsOnMaintenance是否为真的逻辑,如果是,请重定向到URL?

1 个答案:

答案 0 :(得分:1)

您可以将其放在ActionFilterAttribute中,并将该属性应用于任何适用的操作/控制器或全局。

public class IsOnMaintenanceAttribute : ActionFilterAttribute
{
    //You'll need to setup your IoC to inject this
    public IMaintenanceDispatcher InjectedMaintenanceDispatcher { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        object ticketIdObj;
        if (!filterContext.ActionParameters.TryGetValue("ticketId", out ticketIdObj))
            return;

        //Make sure it exists
        if (InjectedMaintenanceDispatcher.IsOnMaintenance(int.parse(ticketIdObj)))
        {
            var routeValues = new RouteValueDictionary(new {
                action = "parkingpage",
                controller = "maintenance",
                area = "ticket" });

            filterContext.Result = new RedirectToRouteResult(routeValues);
            return;
        }
    }
}

注意,您的操作方法参数需要包含一个名为ticketId的变量,以使filterContext.ActionParameters.TryGetValue起作用。

注意:我曾假设个别机票已进入维护模式并且您想要检查...但重新阅读问题似乎您希望将整个区域/站点置于保持状态。即使有这种情况,ActionFilterAttribute示例仍然存在......只是没有那么不同。