2013-04-17 34 views
1

我正在将ASP.Net Web窗体应用程序转换为MVC 4.这些应用程序显示通用项目,并且可以使用一个域模型来处理大多数需要显示。应用程序仅显示数据并且不修改数据。ASP.NET MVC 4具有多个应用程序和缓存的一个域模型

当前,当用户访问一个页面时,数据从Oracle数据库中检索。该页面每30秒更新一次更新面板。因此,如果有多个用户将他们的页面打开(这很常见),则每个用户都会打开数据库。每30秒。

数据库数据每3分钟更新一次。

我想要做的是每30秒更新一次域模型,应用程序从模型中获取数据。所以,每次发出页面请求时,都会从模型中获取数据。由于应用程序的所有数据都是从同一个域模型中检索的,因此它们都是相同的。这也应该减少数据库被击中的次数,并希望加快页面重新加载(和Ajax调用)。

因此, - 如果这是第一次使用域模型,请从数据库填充它。 - 如果它小于或等于30秒,应用程序将使用域模型 - 如果已超过30秒,则模型将从数据库重新填充,应用程序将从模型中获取数据。

是否有可能让这些多个应用程序使用一个域模型?而且,如果有可能以某种方式缓存域模型,那么这怎么做呢?

在此先感谢。

回答

2

您可以在控制器中缓存数据库调用的结果。

public ActionResult MyController() 
{ 
    var cache = HttpContext.Cache; 
    var model = cache["key"]; 
    if (model == null) { 
     model = GetData(); 
     cache.Insert(
      "key", 
      model, 
      null, 
      DateTime.Now.AddSeconds(30), 
      System.Web.Caching.Cache.NoSlidingExpiration); 
    } 

    return View(model); 
} 

或者您可以通过将OutputCache属性添加到控制器来缓存整个视图。

[OutputCache(Duration = 30, VaryByParam = "none")] 
public ActionResult MyController() 
{   
    var model = GetData(); 
    return View(model); 
} 
2

您可以通过使用超时轮询服务器来模拟jQuery AJAX中的UpdatePanel功能,同时还可以将模型发送到服务器。

基本上,您的页面加载,您的HttpGet操作方法将从数据库中填充您的模型,然后将其发送到您的视图。

首先,你必须有一个会为你UpdatePanel作用的局部视图,包装在一个容器,我们可以在jQuery的参考:

<div id="stateContainer"> 
    @Html.Partial("YourPartial", Model) 
</div> 

那么你的jQuery会做这样的事情:

setInterval("pollServer()", 30000); 

function pollServer() { 
    $.ajax({ 
     url: '@Url.Action("PollForUpdate")', 
     type: "POST", 
     datatype: 'json', 
     data: $("form").serialize(), 
     success: function (result) { 
      $("#stateContainer").html(result); 
     } 
    }); 
} 

那么你的操作方法PollForUpdate看起来是这样的:

public ActionResult PollForUpdate(YourModel Model) 
{ 
    ModelState.Clear(); 

    //fill your Model object with your database stuff 

    return View("YourPartial", Model); 
} 
+0

我喜欢这两个解决方案,但我不得不为我实施的投票。谢谢 – ScottCollier

相关问题