是否可以将东西存储在 MVC 控制器中?

Is it possible to store things in a MVC Controller?

这可能是一个愚蠢的问题,我什至怀疑这是否是一个好的做法,但我想确定地知道,所以就开始吧。

如果 HomeController 有一个列表作为字段,并且一个用户向其中添加,那么该用户会取回包含某些内容的列表还是空的?

当有更多用户时,那(不是?)怎么办?他们应该有自己的名单吗?

我问是因为我知道如何在客户端保留小的东西,在数据库中保留大的东西,但我想知道我是否有 "Server" 选项,我可以在 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 被设计为相对无状态的。这就是控制器按原样实例化和处置的部分原因。

听起来您的应用程序可能需要稍微重新考虑一下,如果您需要的话。您可以 以多种方式保留您的列表,包括会话和 static 修饰符,但您不应该这样做。

ASP.NET 为每个请求创建一个 HomeController 实例。因此,您发布列表的代码只会在请求的生命周期内有效。如果将列表设为静态,如下所示:

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

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

通常,如果您发现自己以这种方式保持大量状态,这意味着您可能以错误的方式处理事情。缓存、会话、Db 或其他一些持久性策略是您通常保持状态的方式。