如何在ASP.NET MVC2中向控制器添加自定义挂钩

时间:2010-05-28 10:09:43

标签: c# asp.net-mvc asp.net-mvc-2

我刚刚使用MVC 2在ASP.net 4.0中启动了一个新项目。

我需要做的是在控制器的每个动作的开始和结束时都有一个自定义挂钩。

e.g。

public void Index() {  
    *** call to the start custom hook to externalfile.cs (is empty so does nothing)

    ViewData["welcomeMessage"] = "Hello World";

    *** call to the end custom hook to externalfile.cs (changes "Hello World!" to "Hi World")

    return View();
}

View会在自定义挂钩中更改后将welcomeMessage视为“Hi World”。

自定义挂钩需要位于外部文件中,而不是更改“核心”编译代码。这导致了一个问题,因为我必须编译ASP.net MVC的有限知识。

有没有人对如何实现这一点有任何建议?

由于

3 个答案:

答案 0 :(得分:3)

您可以根据ActionFilterAttribute创建自己的课程。它有以下钩子。

  1. OnActionExecuted
  2. OnActionExecuting
  3. OnResultExecuted
  4. OnResultExecuting
  5. 例如,

    public class MyFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            var controller = filterContext.Controller;
    
            controller.ViewData["welcomeMessage"] = "Hi World!";
            controller.TempData["Access_My_TempData"] = "Some Value";
    
            base.OnActionExecuted(filterContext);
        }
    }
    

    您还可以检查Action方法正在执行的[Action]类型。

    if ((filterContext.Result is RedirectResult) || (filterContext.Result is RedirectToRouteResult))
    {
        // do something only if we are redirecting to a different action
    }
    else if (filterContext.Result is ViewResult)
    {
        // this is just a normal View action
    }
    

    哦,我忘了展示如何使用该属性 你只是在你的行动方法上装饰。

    [MyFilterAttribute]
    public ActionResult MyActionMethod()
    {
        return View();
    }
    

答案 1 :(得分:1)

基于事件的插件系统,您可以在其中动态调用脚本代码。因此,创建(例如)在控制器引发事件时调用的铁python脚本。

不一定是铁蟒,但这将是我能看到的最有意义的。

答案 2 :(得分:0)

如何覆盖OnActionExecuting / OnActionExecuted并使用MEF(导入,导出其他汇编代码)?