我有一个脚本,该脚本在加载数据后呈现局部视图,但是我希望至少有一个其他局部视图使用相同的数据加载。这是一个长时间运行的查询(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/

10-16 09:57
查看更多