我正在构建一个ASP.NET MVC3计算机支持票务门户。
存在维护状态,最好禁止用户与EF /数据库交互,以避免我目前遇到的“冲突”。
每当后台逻辑将门户网站置于该状态时,我有一个IMaintenanceDispatcher
,其业务逻辑将布尔属性IsOnMaintenance
设置为true。
我需要在维护时将客户端请求重定向到停放页面。
我在哪里放置将检查IsOnMaintenance
是否为真的逻辑,如果是,请重定向到URL?
答案 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
示例仍然存在......只是没有那么不同。