为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
扬帆大鱼 2021-11-28 20:01:55
我的 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调用一次查询 ( ),然后将返回的数据传递给需要它的每个控制器方法?这将大大提高代码的可重用性以及最终用户的性能。我以前从未做过这样的事情,我不确定我(试图)描述的内容是否可能?我真的很感激任何帮助。谢谢你。
查看完整描述

2 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

您没有发出 1 个请求——您发出了 1 个加载页面的请求,然后是 5 个获取数据的请求。除非您考虑使用缓存,否则您无法在调用之间保留这样的数据。

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

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


查看完整回答
反对 回复 2021-11-28
?
慕的地10843

TA贡献1785条经验 获得超8个赞

为了使 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()。


查看完整回答
反对 回复 2021-11-28
  • 2 回答
  • 0 关注
  • 188 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信