亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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 關注
  • 223 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號