【问题标题】:How can I execute common code for every request?如何为每个请求执行通用代码?
【发布时间】:2013-10-09 08:47:03
【问题描述】:

有没有可能找到像Page_Load 这样的函数?我有 MVC 应用程序,我需要在每个页面加载或重新加载时运行一些代码,或者我调用一些控制器。一个所有类的共享函数?

我尝试了 Application_Start,但这仅在应用程序第一次运行时执行。我搜索了一些类似BeginRequest,但是这个函数已经被调用了好几次,我只需要第一次,当我加载页面并且我需要结束函数,比如整个项目的构造函数和析构函数。

这里是示例代码。

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
    }  
}

document.ready 不是我的情况。并且调用每个控制器的函数是最后的选择。代码必须在调用任何其他函数之前执行。在一切结束之前,我需要运行结束功能。例如,起初我需要为所有类创建共享的 mysql 连接器。最后我需要关闭 mysql 连接。

【问题讨论】:

  • 你可以在mvc中使用布局
  • 调用控制器中的函数。每次加载/重新加载页面时都会点击。
  • 也许您正在寻找ActionFilterApplication_BeginRequest 也会触发静态文件。
  • BeginRequest 是个好主意,但我试过了,函数被调用了好几次,不止一次。
  • 如@Stijn ActionFilter 所述,似乎是一个非常有趣的选择,允许保留轻量级控制器,而不用以技术为中心的层次结构阻碍您的代码。

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


【解决方案1】:

让您的所有控制器都继承自自定义 BaseController:

public class BaseController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext context)
    {
        base.OnActionExecuting(context);
        // your code here
    }
}

public class HomeController : BaseController // instead of Controller
{
    // ...
}

【讨论】:

  • 是的,这是更好的解决方案。你知道吗,我是如何在 BaseController 中设置析构函数的?
  • 假设你的意思不是真正的“析构函数”而是“在请求处理后做一些事情”,你应该像使用 OnActionExecuting 一样使用 OnActionExecuted。如果您在垃圾收集器处理任何控制器时绝对必须做某事,只需像往常一样定义一个 ~BaseController() 函数。请注意,您完全无法控制何时调用此函数。
  • 是否有关于控制器生命周期的官方文档?还有哪些方法可以覆盖?
  • @styfle,这里有完整的 MVC 管道文档:docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/…。建议下载此页面上的 PDF 以便更好地查看。
  • 但是如果您需要在 BaseController 中进行依赖注入怎么办?并且需要等待调用 API?来自 API 的信息应在所有控制器中使用。
【解决方案2】:

对 Jan 的回答进行了更新。 onExecutingAction 抽象方法是公开的,现在不受保护。

public virtual void OnActionExecuting(ActionExecutingContext context);

因此,您不能在覆盖时使用protected 访问修饰符。改为公开。

public class BaseController : Controller
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        base.OnActionExecuting(context);
    }
}

【讨论】:

  • 非常感谢,我花了好几个小时才弄明白。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 2013-12-22
  • 1970-01-01
  • 2016-01-05
相关资源
最近更新 更多