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

我的 MVC 5 应用程序中有一个 Razor 视图,它在点击时调用 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 个控制器方法(GetData1、GetData2 等)var query = _myService.GetData()中的每一个中,查询 ( ) 在每个方法中都被调用,因此,将返回相同的数据集。我的问题是,我不想在 5 个 Controller 方法中的每一个中都调用相同的查询五次。每个 Controller 方法对返回的查询数据的处理方式非常不同,因此,每个方法仍然需要存在。


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


这将大大提高代码的可重用性以及最终用户的性能。


我以前从未做过这样的事情,我不确定我(试图)描述的内容是否可能?


我真的很感激任何帮助。


谢谢你。


扬帆大鱼
浏览 189回答 2
2回答

素胚勾勒不出你

您没有发出 1 个请求——您发出了 1 个加载页面的请求,然后是 5 个获取数据的请求。除非您考虑使用缓存,否则您无法在调用之间保留这样的数据。https://msdn.microsoft.com/en-us/library/system.web.caching.cache(v=vs.110).aspx我的想法是您的控制器方法应该首先检查缓存以查看该项目是否存在,如果存在,则将其拉出并返回。如果该项目不存在,则.GetData()在返回数据之前调用 \并立即将其存储在缓存中。您还可以设置一些选项,让数据在几分钟后过期。

慕的地10843

为了使 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()。
打开App,查看更多内容
随时随地看视频慕课网APP