1

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

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

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

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

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

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

提前致谢。

4

2 回答 2

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);
}
于 2013-04-17T14:24:05.507 回答
2

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

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

首先,你必须有一个 Partial 视图作为你的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);
}
于 2013-04-17T13:38:27.390 回答