我在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方法?
这将极大地提高代码的可重用性,并提高最终用户的性能。
我以前从未做过类似的事情,而且不确定(尝试)描述的内容是否可行?
我将非常感谢您的帮助。
谢谢。
答案 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。