C# 在会话中存储模型与重新创建模型
使用以下两种方法之一是否有危险?有什么最佳实践吗 我想知道当网站上同时有很多用户在线时,我是否会撞到墙C# 在会话中存储模型与重新创建模型,c#,asp.net-mvc,C#,Asp.net Mvc,使用以下两种方法之一是否有危险?有什么最佳实践吗 我想知道当网站上同时有很多用户在线时,我是否会撞到墙 将模型存储在会话中以供以后重用 public ActionResult Index() { var model = new Model(); Session["Model"] = model; return View(model); } [HttpPost] public ActionResult Index(FormCollection fc) { var
public ActionResult Index()
{
var model = new Model();
Session["Model"] = model;
return View(model);
}
[HttpPost]
public ActionResult Index(FormCollection fc)
{
var model = (Model)Session["Model"];
//Update stuff
return View(model);
}
public ActionResult Index()
{
var model = new Model();
return View(model);
}
[HttpPost]
public ActionResult Index(FormCollection fc)
{
var model = new Model();
//Update stuff
return View(model);
}
- 可能包含大量对数据库的调用(可能需要一些时间才能完成) 初始化它们)
- 可能包含信息列表(大量数据)
Atavari的回答完全脱离主题,根本不理解问题。这两种方法都是错误的。您的post操作应该接收模型,而不是
FormCollection
对象
[HttpPost]
public ActionResult Index(Model model)
{
//Update stuff
return View(model);
}
而且,通常在添加/更新成功后重定向到不同的页面,并且只有在出现验证错误时才返回相同的视图。因此,您的后期操作应该更像这样:
[HttpPost]
public ActionResult Index(Model model)
{
if(ModelState.IsValid)
{
//Update stuff
//return to a different page or whatever needs to be done
//after a successful update
}
// If model is not valid...
return View(model);
}
更新:
如果模型中有未发布到操作的属性(如下拉列表中的SelectList
),则只有在希望返回相同视图时(通常在出现验证错误时)才需要这些属性。在这种情况下,您不必重新创建模型。您只需重新填充这些属性
假设您的模型有一个名为Items的属性。这是您的操作应该是什么样子的:
public ActionResult Index()
{
var model = new Model();
model.Items = GetItems();
return View(model);
}
[HttpPost]
public ActionResult Index(Model model)
{
if(ModelState.IsValid)
{
//Update stuff
//return to a different page or whatever needs to be done
//after a successful update
}
// If model is not valid...
model.Items = GetItems();
return View(model);
}
这取决于你真正拥有多少用户。使用session可以轻松自如,但可伸缩性可能会成为一个问题
如果您使用它只是为了提高性能,我建议您改用缓存。注意缓存中的对象可能会过期,所以您必须始终检查它们是否仍然存在。缓存优于会话,因为它是自优化的。如果内存不足,它会自动清理,而会话变量永远不会清理(当然,除非会话过期)。为什么-1?你能至少解释一下吗?-1因为它不回答问题,而且包含“错误”。使用模型绑定确实是一种很好的技术(我也使用它),但您不能将模型中包含的所有信息都放在网页的post方法中。例如,如果模型包含要在页面上显示的对象列表,则您不会将每个对象都放在表单中,以便以后能够使用模型绑定重建它。这毫无意义。使用模型绑定不是一种好技术,而是一种新技术。顺便问一下,代码中的“错误”在哪里?检查我的更新答案。好答案。发布模型是标准做法。仅在出错时返回视图,但在成功时重定向也是一种良好的做法,称为post redirect get模式。这有助于防止在成功的帖子尝试重新发送帖子数据后刷新页面的问题。@Gudradain,我不在乎你怎么做。我只是在谈论这个具体的问题。您正在通过控制器将模型传递给视图。POST操作应将模型作为参数接收(ModelBinding)。因此,您永远不会在post操作中重新创建模型,也不会将其保存在会话或缓存中。时期如果您熟悉MVC的概念,那么这就没有任何意义。模型不应该直接与数据库通信。模型应该是领域中某个概念的表示。您应该有某种数据层,从数据库检索模型并将其提供给控制器(还可以将更改保存回数据库)。通常,这是一个存储库类,如果您使用的是实体框架,则称为
DbContext
。检索模型可能类似于DbContext=newdbcontext();ProductModel product=context.Products.Where(p=>p.ProductId==Id).Single()代码>,然后将产品传递给视图。@梅森,请继续讨论主题。数据库调用是否应该在模型或控制器中是一个完全不同的主题,与此问题无关。无论在何处调用数据库,成本都是相同的。@Gudradain检索信息所需的时间都是相同的。但是,遵循一个完全有缺陷的体系结构将花费您大量的开发时间,并导致应用程序不稳定且无法维护。我意识到听到你可能需要重新调整你的工作方式是不愉快的,但我正试图在今后为你省去很多麻烦。你可能不认为这很重要,但我现在正在重构一个与你的应用程序类似的应用程序,如果一开始就做的话会容易得多。对我来说,“不停留在话题上”想象一下:你走进医生的办公室,因为你担心你的手可能骨折了。他们做X光检查,告诉你他们可能发现了肿瘤,但你告诉医生他需要继续讨论这个话题,你是来了解你的手,而不是癌症的。但是医生知道,如果你不解决它,这种癌症将是一个大问题,一个比断手更大的问题。堆栈溢出是这里的文档。听我们说,我们/我正试图为您节省很多麻烦。您在问题中表示,每个模型都与数据库通信。如果您正确地遵循了存储库模式,那么就不应该发生这种情况。您可能有单元测试,但如果您没有遵循正确的关注点分离,我严重怀疑它们隔离模型以正确测试它们的能力。这个答案是不相关的。你不应该使用缓存来达到这样的目的。为什么?你把对象放在缓存里五分钟,有什么问题吗?您永远不应该出于性能原因使用会话,问题是关于性能的问题是关于性能的问题,但您甚至不需要保存模型。