ASP.NET MVC 4为多个应用程序和缓存提供了一个域模型

本文关键字:模型 一个 缓存 MVC NET 应用程序 ASP | 更新日期: 2023-09-27 18:09:52

我正在转换ASP。asp.net Web Forms应用到MVC 4。这些应用程序显示公共项目,并且可以为需要显示的大多数项目使用一个域模型。应用程序只显示数据,不修改数据。

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

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

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

,—如果是第一次使用域模型,请从数据库中填充。—如果小于等于30秒,则应用使用该域模型—如果超过30秒,则从数据库中重新填充模型,应用程序从模型中获取数据。

有可能让这些多个应用程序使用一个域模型吗?而且,如果有可能以某种方式缓存域模型,该如何实现呢?

ASP.NET MVC 4为多个应用程序和缓存提供了一个域模型

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

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);
}

你可以在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);
}