MVC5在所有函数中保留对象

时间:2015-01-21 19:51:54

标签: asp.net-mvc asp.net-mvc-5

这个问题可能听起来很愚蠢,但我是asp.net mvc的新手,无法找到我的问题的答案。 在我的应用程序(游戏)中,我有一个GameModel游戏模型(它包含一个多维数组)。我想要的是能够在我使用的每个控制器中使用相同的对象。所以我创建它一次,之后在每个控制器函数中使用它。 基本上有一个视图,和控制器中的所有其他功能使用模型的功能编辑对象

我的想法是将对象放在会话变量中,如果没有设置对象设置对象,则创建一个检查会话变量的函数。但这对我来说并不合乎逻辑,希望有人有更好的解决方案。

2 个答案:

答案 0 :(得分:3)

根据您的问题,您希望跟踪用户的数据(游戏数据)。​​

在Session变量中存储GameModel对于该场景是有意义的。

如果你发现自己从很多地方调用了Session变量,你可以创建一个 BaseController 并保留它。然后继承它的所有控制器。

例如,

public class BaseController : Controller
{
    public GameModel CurrentGameModel
    {
        get
        {
            var model = Session["GameModel"] as GameModel;
            if (model == null)
            {
                model = new GameModel();
                Session["GameModel"] = model;
            }
            return model;
        }
        set { Session["GameModel"] = value; }
    }
}

public class HomeController : BaseController
{
}

注意: 您必须记住,如果应用程序池回收应用程序崩溃,则所有数据存储在Session变量中的内容将丢失。

如果要保留数据,则需要存储在数据库等持久存储中。

答案 1 :(得分:1)

我不明白为什么你认为Session看起来不错。它的目的是通过多个请求准确地保持每个用户的数据。

您还可以使用隐藏字段将游戏状态返回给客户端。鉴于你的游戏状态在服务器中没有变化,作为对其他人行动的回应,这甚至会比Session更好。

最后,您可以使用类的静态属性。 ASP.NET中的静态属性通过应用程序生命周期保持活动,并且对所有用户同等可见。意思是,如果用户在那里写东西,另一个用户可以阅读它。但是,您可以使用Dictionary<>为每个用户分配数据,其中密钥是用户ID。