【问题标题】:How to call a function *only once* in ASP.NET MVC page cycle如何在 ASP.NET MVC 页面循环中调用函数*仅一次*
【发布时间】:2010-08-25 06:23:44
【问题描述】:

我有一个 ASP.NET MVC Web 应用程序,并且有一个函数,当页面只加载一次时我需要调用它。现在我有从基本控制器 OnActionExecuted 调用的函数。

我遇到的问题是这个函数被多次调用 - 一次用于页面,然后多次用于我在页面上进行的不同 ajax 调用。我已经尝试将该函数放在 Controller Initialize 上,但是对于每个对控制器操作的 ajax 调用也会调用此函数。那么在 ASP.NET MVC 页面循环中是否有一些函数只在请求页面(GET)而不是所有 ajax 调用(POST)时才被调用?我唯一能想到的是将所有 ajax 调用放在不从基本控制器继承的单独控制器中,但必须有更好的解决方案。

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    根据您执行 AjaxRequests 的方式,您可以使用以下内容:

    public ActionResult Index()
    {
        if (!Request.IsAjaxRequest())
        {
            LoadConfiguration();
        }
    
        // Rest of Action method (snip)...
    }
    

    例如,如果您正在使用jQuery JavaScript library 执行 Ajax,它会向服务器发送一个特殊令牌以指示它是一个 Ajax 调用(我确信其他库也这样做)。如果有人更改 JavaScript 代码以执行 GET Ajax 请求,这可能会更好。


    你提到的一件事确实让我很感兴趣 “我遇到的问题是这个函数被多次调用” - 实际上'技术上'这不是真的.它只被调用一次......每个请求,所有这些 Ajax 调用都被服务器视为单独的请求,就好像用户正在通过 Web 浏览器请求页面一样。听起来您真正需要的是一种区分网页 HTTP 请求和 Ajax HTTP 请求的方法,因此上述解决方案。

    【讨论】:

      【解决方案2】:

      发布问题后我就想到了......

      protected override void Initialize(System.Web.Routing.RequestContext requestContext)
      {
          base.Initialize(requestContext);
          if (Request.HttpMethod == "GET")
          {
              LoadConfiguration();
          } 
      }
      

      【讨论】:

      • 这不一定能如你所愿 - 许多 AJAX 操作也使用 GET。
      【解决方案3】:

      您可以在应用程序范围内执行此工作(在启动时,在 global.asax 或其他类似方法中),或在会话中存储配置对象(或标识它已经完成的标志,如果有没有什么可存储的)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-06
        • 2017-08-21
        • 1970-01-01
        • 2017-11-10
        • 1970-01-01
        • 2014-07-25
        相关资源
        最近更新 更多