我有一个脚本,该脚本在加载数据后呈现局部视图,但是我希望至少有一个其他局部视图使用相同的数据加载。这是一个长时间运行的查询(30秒-1分钟),所以我不想为每个局部视图加载它。还是我走错了路?应该指出的是,我对ASP.Net还是一个新手,对于Javascript / Jquery还是一个新手,所以我并不完全了解最佳实践,因此,如果您发现“违背约定”的内容,请告诉我,太。
编辑:突然出现在我身上,我应该记下我最终想要达到的目标。在我当前的非ASP应用程序(C#/ XAML)中,它在应用程序加载时加载数据(使用下面等效的LoadMonitorData方法),然后每15分钟刷新一次。或者可以通过“刷新”按钮触发刷新。
这是到目前为止我得到的...任何帮助或指导将不胜感激。
Index.cshtml
@{
ViewBag.Title = "MMCView";
}
@section scripts {
<script type="text/javascript">
$(document).on('click', '[name^=project]', function () {
if ($(this).hasClass('selected')) {
$('.mig-project').removeClass('selected').removeClass('low-opacity').addClass('full-opacity');
$('#data-area').removeClass('show-data-view');
}
else {
$(this).addClass("selected").addClass('full-opacity').removeClass('low-opacity');
$('.mig-project').not(this).removeClass("full-opacity").removeClass('selected').addClass("low-opacity");
$('#data-area').load($(this).data("url"));
$('#data-area').addClass('show-data-view');
}
})
</script>
<script type="text/javascript">
$(document).ready(function(e) {
$("#list-container").each(function(index, item) {
var url = $(item).data("url");
if (url && url.length > 0) {
$(item).load(url);
}
})
})
</script>
}
<div class="project-list slow-load" id="list-container" data-url="/mmc/projectpanes">
<img src="loading.gif" />
</div>
<div class="hide-data-view slow-load" id="data-area" data-url="/mmc/projectdata"></div>
MMCController.cs
using MMC_ASP.Models;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Web.Mvc;
using System.Web.Script.Serialization;
namespace MMC_ASP.Controllers
{
public class MMCController : AsyncController
{
MonitorData downloadedInfo = new MonitorData();
//GET: MMC
public ActionResult Index()
{
return View();
}
public ActionResult ProjectPanes()
{
downloadedInfo = LoadMonitorData();
return PartialView("_ProjectPanes", downloadedInfo.MainPanel.OrderBy(o => o.Client).ToList());
}
public ActionResult ProjectData(string server)
{
return PartialView("_ProjectData", downloadedInfo.Information.Where(x => x.ServerName == server).ToList());
}
public ActionResult MainWindowMonitor()
{
return PartialView("_MainWindowMonitor", downloadedInfo.MonitorText);
}
public MonitorData LoadMonitorData()
{
MonitorData deserializedData = null;
using (WebClient wc = new WebClient())
{
wc.Encoding = Encoding.Unicode;
string location = "http://MYWEBAPI-RETURNS-JSON";
string data = wc.DownloadString(new System.Uri(location));
var deserializer = new JavaScriptSerializer();
deserializedData = deserializer.Deserialize<MonitorData>(data);
}
return deserializedData;
}
}
}
最佳答案
在这种情况下,缓存对象可能对您有用。您可以将数据存储在缓存中,将其设置为在合理的时间后过期,如果缓存的数据已过期,则编写辅助函数以即时重新拉取数据,并使部分视图从缓存中提取数据。辅助功能。这样,无论使用多少视图,都将仅根据需要提取新数据,此外,您可以轻松控制重新执行该昂贵查询的频率。
请注意,这在您的情况下效果很好,因为您的数据本质上是全局的。如果要将特定于用户的参数传递到查询中,则Cache不适合。
using System.Web.Caching;
private MonitorData getCachedData()
{
var cache = this.HttpContext.Cache;
if (cache["MonitorData"] == null)
cache.Add("MonitorData", LoadMonitorData(), null, DateTime.Now.AddMinutes(15), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null); // 15 minute cache expiration, as example
return (MonitorData)cache["MonitorData"];
}
public ActionResult ProjectPanes()
{
downloadedInfo = getCachedData();
return PartialView("_ProjectPanes", downloadedInfo.MainPanel.OrderBy(o => o.Client).ToList());
}
public ActionResult ProjectData(string server)
{
downloadedInfo = getCachedData();
return PartialView("_ProjectData", downloadedInfo.Information.Where(x => x.ServerName == server).ToList());
}
public ActionResult MainWindowMonitor()
{
downloadedInfo = getCachedData();
return PartialView("_MainWindowMonitor", downloadedInfo.MonitorText);
}
关于javascript - 在另一个 View 中加载数据后,加载一个局部 View (或多个 View ),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42864456/