一千萬個為什麽

搜索

如何在ASP.NET MVC 2中的每個控制器操作之前獲取某些代碼?

我想檢查一些關於會話狀態,用戶代理等的事情,並且可能在控制器方法有機會執行之前采取行動並返回特殊視圖。例如:

最常見的:
用戶請求主頁/索引
系統檢查以確保x!= 0.
x不等於零,因此Home/Index控制器執行正常。

但是,有時候:
用戶請求主頁/索引
系統檢查以確保x!= 0.
x DOES等於零。必須通知用戶,並且不能允許執行所請求的控制器操作。

認為這涉及ActionFilters的使用。但我已經閱讀過它們,我不明白我是否可以搶占控制器方法並在執行之前返回一個視圖。我確信我可以在控制器方法運行之前執行代碼,但是如何防止它在某些情況下運行並返回自定義視圖,或者直接轉到不同的控制器方法?

更新:我實施了RM的解決方案。這就是我做的:

public class MyAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (myValue == wrongValue)
        {
            filterContext.Result = new ViewResult{ViewName = "Notice"};
        }
        base.OnActionExecuting(filterContext);
    }
}

現在,當myValue出錯時,這些用戶將獲得Notice視圖,並且永遠不會執行所請求的控制器。為了完成這項工作,我將它應用於我所有控制器繼承的ControllerBase。

最佳答案

一切都取決於你想要做什麽,以及如何做。以下三個選項:


您可以為此使用路徑約束。在評估要匹配的路徑時執行它們。

routes.MapRoute(
    "HomeWithConstraint",
    "Home/{action}",
    new {controller="Home", action="index"},
    new { x = new MyCustomRouteConstraint() }
);

// without constraint, i.e. if above didnt pass
routes.MapRoute(
    "HomeWithConstraint",
    "Home/{action}",
    new {controller="Home", action="index"}
);

上面的MyCustomRouteConstraint類型將在您的示例中檢查x == 0等。不確定您想要做什麽,但這將允許您在運行前檢查條件並設置其他路線值等。

有關自定義路由約束的示例,請參見此處


或者,是的,您可以使用自定義ActionFilter,只需將其應用於控制器類,並在執行任何操作之前調用它。就像是:

public class CheckXActionFilterAttribute : ActionFilterAttribute
{

      public override void OnActionExecuting(ActionExecutingContext filterContext)
      {
           if(x == 0)
           {
              //do something
              //e.g. Set ActionParameters etc
           }
           else
           {
              //do something else
           }
      }


}

另一個選擇是讓所有控制器(或相關控制器)繼承自您制作的自定義控制器,並覆蓋:

OnActionExecuting

請參閱此處詳情。

與過濾器或路由約束相同。

轉載註明原文: 如何在ASP.NET MVC 2中的每個控制器操作之前獲取某些代碼?