多个AJAX调用共享MVC控制器中的相同数据集

时间:2018-08-15 13:03:46

标签: c# ajax asp.net-mvc

我在MVC 5应用程序中有一个Razor View,点击时会调用5个JavaScript函数。

在5个JavaScript函数的每个函数中,我的MVC控制器中都有一个对相关方法的AJAX调用,每个函数都返回JSON数据。

所以...

JavaScript

$(document).ready(function () {

LoadData1();
LoadData2();
LoadData3();
LoadData4();
LoadData5();

function LoadData1()
{
    $.ajax({
        type: 'GET',
        url: '/MyController/GetData1/',
        //Rest of code});
}

//Rest of LoadData methods

});

控制器

[HttpGet]
public ContentResult GetData1()
{

 var query = _myService.GetData();
 //Rest of code
}

[HttpGet]
public ContentResult GetData2()
{

 var query = _myService.GetData();
 //Rest of code
}

//Rest of controller methods GetData3 etc...

上述方法有效,但是,在5个Controller方法(GetData1,GetData2等)的每个内部,都在其中调用了查询(var query = _myService.GetData()),因此,正在使用相同的数据集回到。我的问题是,我不想在5个Controller方法中的每个方法中都必须调用相同的查询五次。每个Controller方法处理返回的查询数据的方式都非常不同,因此,每种方法仍然需要存在。

但是,有什么方法可以让我在Controller中某个位置的每个HttpRequest调用一次查询(var query = _myService.GetData()),然后将返回的数据传递给需要它的每个Controller方法?

这将极大地提高代码的可重用性,并提高最终用户的性能。

我以前从未做过类似的事情,而且不确定(尝试)描述的内容是否可行?

我将非常感谢您的帮助。

谢谢。

2 个答案:

答案 0 :(得分:1)

您没有发出1个请求-您正在发出1个请求来加载页面,然后发出5个请求来获取数据。除非您考虑使用缓存,否则您将无法在调用之间持久保存此类数据。

https://msdn.microsoft.com/en-us/library/system.web.caching.cache(v=vs.110).aspx

我的想法是,您的控制器方法应首先检查缓存以查看该项目是否存在,如果存在,则将其取出并返回。如果该项目不存在,则\调用.GetData()并立即将其存储在缓存中,然后返回数据。您还可以设置一些选项,以便在几分钟后使数据过期。

答案 1 :(得分:0)

要使Jason的答案更具体,一种选择是使用MemoryCache类在指定的时间段内跨AJAX调用缓存数据,如下所示:

using System.Runtime.Caching;

[HttpGet]
public ContentResult GetData1()
{
    var query = GetData();
    //Rest of code
}

public object GetData()
{
    string key = "myDataKey";
    object data = MemoryCache.Default.Get(key) as object;  // specify your type instead of object

    if (data == null)  // not in cache, need to go to DB
    {
        data = _myService.GetData();

        // Cache it for 5 minutes.
        DateTimeOffset duration = DateTimeOffset.UtcNow.AddMinutes(5);
        MemoryCache.Default.AddOrGetExisting(key, data, duration);
    }
        
    return data;
}

如果线程同步成为问题,则可能需要在GetData()中的代码周围放置lock