C# 在MVC应用程序中维护模型生命周期

C# 在MVC应用程序中维护模型生命周期,c#,asp.net-mvc,C#,Asp.net Mvc,我是MVC新手,我有一个非常简单的问题。 当用户登录到我的应用程序时,我需要为用户创建一个特定的对象模型,例如UserObject 此对象对于当前登录的用户是唯一的,仅当用户单击注销时才应释放。 我不知道如何维护对象的生命周期。就像我创建了控制器类的Action方法中的object一样,一旦请求完成,我就失去了对象的引用 应该如何做到这一点?实际上,您试图实现的是将模型从一个控制器传递到另一个控制器,这是不可能的。当一个动作被执行时,模型对象的上下文在视图中被释放,并且它不能从一个控制器传递到另

我是MVC新手,我有一个非常简单的问题。 当用户登录到我的应用程序时,我需要为用户创建一个特定的对象模型,例如UserObject

此对象对于当前登录的用户是唯一的,仅当用户单击注销时才应释放。 我不知道如何维护对象的生命周期。就像我创建了控制器类的Action方法中的object一样,一旦请求完成,我就失去了对象的引用

应该如何做到这一点?

实际上,您试图实现的是将模型从一个控制器传递到另一个控制器,这是不可能的。当一个动作被执行时,模型对象的上下文在视图中被释放,并且它不能从一个控制器传递到另一个控制器。您必须创建一个新对象重新填充它并使用它在不同的控制器中实现目标。如果需要持久化数据,您可以使用会话,但仍然需要在每个控制器中创建模型的对象

下图供您参考,以了解在模型视图控制器之间传递数据时使用的内容。如果您需要更多信息,请随时询问


您的模型的生命周期只会和请求一样长。因此,每当用户转到另一个页面或刷新时,MVC框架将在其中实例化一个新的控制器和模型。否则,您的服务器将有大量静态对象在内存中浮动,这将占用大量资源,并且无法扩展

为了管理状态,您需要使用其他方法,例如会话/cookie和数据库

假设用户通过/user/Login登录。这会将请求路由到名为UserController.Login的操作

在这个动作中,它实例化了一个UserModel

public ActionResult Login(string username, string password) {
    var userModel = new UserModel();
    if (userModel.Authenticate(username, password)) {
        // Setup your session to maintain state
        Session["username"] = username;
    } else {
        return View("Login");
    }
    return View("LoginComplete");
}
您可能希望用户模型实际创建会话,但为了清晰起见,我在这里展示了它

用户模型对用户进行身份验证,然后创建一个会话,就像在传统的非MVC站点中一样

然后在后续的请求中,您需要授权用户,并使用您必须的任何会话数据来检索状态信息

public ActionResult SuperSecretPlace() {
    var userModel = new UserModel();
    string username = Session["username"]
    var user = userModel.GetUserByUsername(username);
    if (user == null) throw new HttpException(401, "User is not authorized.");
    return View("SuperSecretPlace", user);
}
在上面的操作中,UserModel可能会执行类似于查询数据库的操作来检索用户的数据,以便将其传递到相应的视图中

如果您想让生活更轻松,您可能只想使用.NET的内置表单身份验证:

有关MVC生命周期的更多信息:


与其他aswer不同,我不会使用session,因为它有一些缺点:可伸缩性、阻碍并发调用的悲观并发性、应用程序池回收。。。。您不应该使用会话的原因在很多地方都有记录,如或

相反,我会把它储存在饼干里


但是,请确保不要存储机密或敏感数据。无论您使用cookie或会话,它都可能被篡改或被盗。如果您处理的是敏感信息,则需要其他信息。另请阅读有关安全cookie解决方案的更多信息。

。为什么要让给定实例保持活动状态,通常的方法是在需要时根据用户id从数据存储中获取新实例。如果要在用户会话存在时持久保存任何数据,则始终建议使用长期有效的会话,或者可以使用MVC提供的TempData。