2017-03-17 4 views
0

データがロードされた後に部分ビューをレンダリングするスクリプトがありますが、同じデータを使用して少なくとも1つの部分ビューをロードする必要があります。これは長時間実行するクエリ(30秒〜1分)なので、部分ビューごとにロードする必要はありません。あるいは間違った道を行くのですか?私はまだASP.Netにはまだまだ新しく、Javascript/Jqueryについては非常に新しくなっているので、ベストプラクティスを完全に認識していないので、「コンベンションに反対」のものを見つけたら、あまりにも。データがロードされた後に部分ビュー(または複数)がロードされる

編集:それは私に最終的に何をしようとしていることに注意する必要があります。私の現在の非ASPアプリケーション(C#/ XAML)では、アプリケーションがロードされてから15分ごとにリフレッシュするときに、(LoadMonitorDataメソッドに相当する)データをロードします。または、リフレッシュはリフレッシュボタンでトリガーできます。

これまで私がこれまで持っていたことは...どんな助けや指導も大歓迎です。

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; 
     } 
    } 
} 
+0

データ結果は同じであり、各アクションは、単にそれをフィルタリングするので、なぜすべてのパーシャルをロードしないと、単にそれらを非表示にしたり、崩壊?そうでない場合は、一定期間データをキャッシュする* http:// MYWEBAPI-RETURNS-JSON *の前にAPIレイヤーを追加することができます。代わりにそのAPIを呼び出すと、それは新鮮さを管理させます。 –

+0

「すべての部分を読み込んで単純に非表示にする」と言うと、私はあなたに従わないと思います。それは私を得ているローディング部分です...隠れている/崩壊私はかなりCSS/JSをダウンしている。私が問題を抱えている 'downloadedInfo'変数にデータを渡しています。キャッシングのアイデアは非常に良いものです...私はある時点でそれを実装することを検討するかもしれません。私は私のポストに明確化のポイントを追加します。 –

+0

おそらく私も混乱しています。あなたはAPIからデータを取得できますか、それとも問題ですか? –

答えて

1

、Cacheオブジェクトは、あなたに役に立つかもしれません。データをキャッシュに保存し、妥当な時間が経過した後に期限切れになるように設定し、キャッシュされたデータが期限切れになった場合にそのデータを即座に再プルするヘルパー機能を作成し、ヘルパー機能。この方法では、新しいデータは、使用しているビューの数に関係なく、必要に応じて取得され、その高価なクエリを再実行する頻度を簡単に制御できます。

これは、データが本質的にグローバルであるため、状況によってはうまくいくことに注意してください。クエリにユーザー固有のパラメータを渡していた場合、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); 
} 
+0

これはすばらしいアイデアですが、私が興味を持っていることは間違いありません。しかし、あなたのサンプルコードは動作しません。簡単な例を捨ててしまったのですか?もしそうなら、あなたはこれを実装するための参考文献に私を紹介することができますか?助けてくれてありがとう! –

+0

また、どこでどのように私はgetCachedDataを実装しますか? –

+0

これは、完全にテストされコンパイルされた例ではなく、既存のアクションメソッドをどのように変更できるかの簡単な例です。私の例では、getCachedDataはコントローラの別のメソッドにすぎません。 –

0

Joe_Irbyが提案した解決策は素晴らしいです!しかし、彼とコミュニケーションを取っている間、私は別のアプローチも見つけました。私はそれをここに含めると思ったので、解決策を探している誰かが自分の状況に最適なものを決めることができます。

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

関連する問題