Saya memiliki skrip yang membuat tampilan sebagian setelah datanya dimuat, tetapi saya ingin setidaknya satu tampilan sebagian lainnya dimuat menggunakan data yang sama. Ini adalah kueri yang berjalan lama (30 detik - 1 menit), jadi saya tidak ingin memuatnya untuk setiap tampilan sebagian. Atau apakah saya akan menempuh jalan yang salah? Perlu dicatat saya masih cukup baru di ASP.Net dan sangat baru di Javascript/Jquery, jadi saya tidak sepenuhnya mengetahui praktik terbaik, jadi jika Anda melihat sesuatu yang "melawan konvensi", beri tahu saya itu, juga.

EDIT: Saya sadar bahwa saya harus mencatat apa yang akhirnya saya coba capai. Di aplikasi non-ASP saya saat ini (C#/XAML), ini memuat data (dengan metode yang setara dengan LoadMonitorData, di bawah) saat aplikasi dimuat, lalu disegarkan setiap 15 menit. Atau penyegaran dapat dipicu oleh tombol Segarkan.

Inilah yang saya dapatkan sejauh ini ... bantuan atau bimbingan apa pun akan sangat dihargai.

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;
        }
    }
}
1
TheDoc 17 Maret 2017, 21:10

2 jawaban

Jawaban Terbaik

Dalam situasi ini, objek Cache mungkin berguna bagi Anda. Anda dapat menyimpan data Anda di Cache, mengaturnya agar kedaluwarsa setelah jangka waktu yang wajar, menulis fungsi pembantu untuk menarik kembali data dengan cepat jika data yang di-cache telah kedaluwarsa, dan meminta sebagian tampilan Anda menarik datanya dari fungsi pembantu. Dengan cara ini, data baru hanya akan ditarik sesuai kebutuhan, terlepas dari berapa banyak tampilan yang menggunakannya, dan sebagai bonus, Anda memiliki kontrol yang mudah atas seberapa sering menjalankan ulang kueri mahal itu.

Perhatikan bahwa ini berfungsi dengan baik dalam situasi Anda karena data Anda bersifat global. Jika Anda meneruskan parameter khusus pengguna ke kueri Anda, maka Cache tidak akan cocok.

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);
}
1
Joe Irby 20 Maret 2017, 20:41

Solusi yang diusulkan Joe_Irby bekerja dengan baik! Namun, saat berkomunikasi dengannya, saya menemukan pendekatan lain yang juga berhasil. Saya pikir saya akan memasukkannya di sini sehingga orang lain yang mencari solusi dapat memutuskan mana yang terbaik untuk situasi mereka.

https://code.msdn.microsoft.com/Caching-In-Web-API-cb40be30

0
TheDoc 22 Maret 2017, 17:30