有可能将东西存储在MVC控制器中吗

Is it possible to store things in a MVC Controller?

本文关键字:MVC 控制器 存储 有可能      更新时间:2023-09-26

这可能是一个愚蠢的问题,我怀疑这是否是一个好的做法,但我想确定,所以就这样吧。

如果HomeController有一个列表作为字段,并且有一个用户添加到其中,那么该用户会将列表中的内容返回还是为空?

当有更多的用户时,该怎么办?他们会有自己的名单吗?

我之所以问这个问题,是因为我知道如何在客户端上保存小东西,在DB中保存大东西,但我想知道我是否有"服务器"选项,在那里我可以在MVC中的控制器中存储一些东西。

public List<int> Ids { get; set; }
public HomeController()
{
    Ids = new List<int>();
}
public ContentResult AddToIds(int id)
{
    Ids.Add(id);
    return Content("Added");
}
public ContentResult GetIds()
{
    return Content(Ids.Count.ToString());
}

否。控制器是为每个请求实例化和处理的,所以你在它上设置的任何东西都不会在下一个请求中幸存下来。

作为Chris答案的补充,MVC被设计成相对无状态的。这就是控制器被实例化并按原样处理的部分原因。

听起来,如果您有此需求,您的应用程序可能需要重新考虑一下。您可以通过多种方式保持列表,包括session和static修饰符,但不应该。

ASP.NET为每个请求创建一个HomeController实例。因此,您在列表中发布的代码将只在请求的生存期内有效。如果你让列表是静态的,就像这样:

public static List<int> Ids { get; set; }

它将在应用程序的整个生命周期内有效。IISRESET或重新启动将意外清空列表。此外,如果您的应用程序在多台计算机上运行(即具有多个实例的Azure网站),则在一个实例上添加的项目在另一个实例上将不可见。

通常,如果你发现自己以这种方式保持着很多状态,这意味着你可能会以错误的方式行事。Cache、Session、Db或其他一些持久性策略是您通常保持状态的方式。