【发布时间】:2017-02-13 04:30:46
【问题描述】:
好的,所以我会尽量让事情简短明了。
您可能知道,我有使用 EntityFramework 的数据库,然后我有由数据库初始化的数据库模型类,然后我有我的视图模型,其中我有每个 html 控件的字段,最后我有我的控制器具有特定的 ViewModel 实例。
我的问题是,视图模型是在我的控制器(任何操作)请求中创建一次,其他时候我总是检查它是否为空,如果它为空,那么我重建视图使用我的数据库模型类从数据库中获取数据的模型,这是正确的做法吗?所以我可以提高性能..对吗?因为我正在重用 View Model 而不是每次都创建它...?
当后台管理员更新某些字段时,问题就出现了。 我该如何克服呢?我看到以下选项:
1) 在我的 ViewModel 对象上设置生命周期(分钟/小时) 控制器(一旦过期,我将其设置为 null)。
2) 我尝试处理 CTRL+F5 组合键并设置 ViewModel 控制器内的对象为空。
3) 我对控制器的每个 http 请求都重建 ViewModel(这个 太糟糕了...)
4) 我使用每个客户端的 Http Session,当后台更新一个 字段,我的 ASP.NET WebApplication 上的每个 Http 会话都被触发 带有一些标志将 View Model 对象设置为 null (我什至不知道 如果这是可能的,但它似乎是最优雅的方式,对吧?
这是我目前正在做的一个示例,但在某些情况下,我可能需要重新创建 ViewModel(因为 View 字段的数据库已更改):
[Authorize]
public class HomeController : Controller
{
private IndexViewModel indexModel;
[Authorize]
public ActionResult Index(IndexViewModel model, string lang = "en")
{
indexModel = model;
if (indexModel == null)
indexModel = new IndexViewModel();
indexModel.SelectedLanguage = lang;
return View(indexModel);
}
//more actions..
}
期待听到您的所有回复和反馈, 这是一个主要关注性能和 CPU 时间优化的问题,我希望我的客户在使用我的网站时获得全新、干净和快速的体验。
谢谢!
编辑:用更多信息编辑问题。
【问题讨论】:
-
你是什么意思在其他时候我总是检查它是否为空?您是否将视图模型存储在
Session中(为什么?)。是什么让你认为在每个请求上初始化你的视图模型是不好的? -
嗨@StephenMuecke 感谢您的回复。我的意思是我做了一些检查模型是否为空的事情,在这种情况下,我再次构建模型,你明白了吗?无论如何我都没有存储模型,模型只是不断地从控制器视图到视图控制器,我在我的操作方法参数中接收模型。我说初始化我的视图模型很糟糕,因为在数据根本没有改变的情况下我将使用 CPU...所以我可以使用模型视图对象中已经存在的相同字段...
-
我的理解是您正在尝试使您的视图模型保持最新,但您不想在每个到达控制器的 http 请求上查询数据库。是这个意思吗?
-
@DarkLink,我不会那样做。如果您想在对控制器的请求之间存储视图模型的状态,最好将其保存到
Cache对象并为其设置过期策略。然后你可以检查对象是否在缓存中可用,如果没有初始化它并从数据库中更新它。 -
您需要在 url 中包含模型的所有属性的值。但这真的没有任何意义,也不清楚你试图用这段代码做什么。网络是无状态的。当您发出请求时,会创建一个新的控制器实例,
indexModel的值将始终为null。如果你没有在 url 中传递你的模型的值,那么model只是IndexViewModel的一个新实例。所以你可以删除第 1 3 行代码,只使用model.SelectedLanguage = lang; return View(model);
标签: c# asp.net-mvc performance caching model