【问题标题】:asp.net mvc keep object alive, informationasp.net mvc 保持对象存活,信息
【发布时间】:2011-09-29 05:28:21
【问题描述】:

我有这个代码

[HttpPost]
public ActionResult Index(LoginModel loginModel)
{
    if (ModelState.IsValid)
    { 
       // some lines of code . bla bla bla
       TempData["loginModel"] = loginModel;
       return RedirectToAction("index", "premium");
     }
     ...
}

还有这个控制器

public ActionResult Index()
{
   var loginModel = TempData["loginModel"] as LoginModel;
   ...
}

现在,当页面加载时,一切似乎都正常。但是当我刷新时,一切都搞砸了,它说 loginModel 就像 null。问题是,我怎样才能跟踪当前的登录用户。我启用了表单身份验证。 tnx

错误如下


Object reference not set to an instance of an object.

Description: An unhandled exception occurred during the execution of the current web     request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: 


Line 22: 
Line 23:             var loginModel = TempData["loginModel"] as LoginModel;
Line 24:             string username = loginModel.username;
Line 25:             string password = loginModel.password;
Line 26:             premiumModel.username = username;

【问题讨论】:

  • 另外,当我们刷新页面时,它不会转到 [HTTPPOST],因为它不是帖子类型。去普通控制器,普通控制器怎么会知道它是同一个访问者,知道用户名和密码。它启用了 cookie。有什么想法吗?
  • 顺便说一下,TempData 存储它们的值直到下次访问,所以你只能使用一次值,这就是它为什么这样命名的原因 =)
  • @Alexander 知道如何使用 controller.user 属性吗? tnx
  • 只需在控制器的某处使用this.User

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4


【解决方案1】:

混乱

但是当我刷新时,一切都搞砸了,它说 loginModel 就像null

回答

这是因为您已经读取了TempData 键,并且一旦读取,该特定键的数据将丢失。

var Value = TempData["keyName"] //Once read, data will be lost

问题

我怎样才能跟踪当前的登录用户

回答

因此,即使在读取数据后也可以持久保存数据,您可以像下面这样活着

var Value = TempData["keyName"];
TempData.Keep();                 //Data will not be lost for all Keys
TempData.Keep("keyName");        //Data will not be lost for this Key

TempData 也可以在新选项卡/Windows 中使用,就像 Session 变量一样。

您也可以使用Session 变量,唯一的主要问题是Session 变量与TempData 相比非常重。最后,您还可以跨控制器/区域保存数据。

希望这篇文章对你有很大帮助。

【讨论】:

    【解决方案2】:

    一旦用户通过身份验证,您只需存储用户的身份(用户名) - 不需要密码。因此,ASP.NET 身份验证已经支持将用户身份存储在身份验证 cookie 中,您不必重新发明轮子。您可以使用Controller.User 属性获取身份。

    编辑:我假设您已经为表单身份验证正确设置了您的应用程序。无论如何,这里有一些入门/教程链接可以帮助您:

    1. http://www.apexa.net/Blog/web_design_Blog_20100319.aspx
    2. http://www.asp.net/mvc/tutorials/authenticating-users-with-forms-authentication-cs
    3. 解释解决方案,这样您就不必对每个操作都应用 Authorize 属性 - http://blogs.msdn.com/b/rickandy/archive/2011/05/02/securing-your-asp-net-mvc-3-application.aspx

    【讨论】:

    • tnx,找不到如何使用 Controller.User 属性的方法。有什么想法>?
    • Controller.User 不是静态属性 --- 你需要一个 Controller 类的实例。您的控制器继承了 Controller 类,因此当您在控制器操作方法(如 Index() 操作)中时,this.User 为您提供用户对象。
    • @nekno,无法创建对象,因为控制器类是抽象类或接口兄弟。如果你想试试。有任何想法吗? tnx
    • @user963499,正如 nekno 指出的那样,只需在控制器代码中使用 this.User
    • @user963499 - 在您的一种操作方法中,例如您发布的两个Index 操作,您将使用this.User。如果要在视图中获取对用户的引用,可以使用Context.User 属性,即@Context.User.Identity.Name
    【解决方案3】:

    TempData 只为一个请求而存在。因此,当您发出第二个请求时,它是空的。如果你想这样做,你应该改用Session,或者你可以看看forms authentication

    您还应该考虑 VinayC 的建议,不要以任何状态存储任何密码信息,尤其是明文格式。

    【讨论】:

      【解决方案4】:

      我建议您通过 File > New 在 Visual Studio 中创建一个新的 MVC 3 项目。它将为您设置表单身份验证,因此您可以查看登录和注册页面的最佳实践,使用会话 cookie 登录/注销用户,并显示用户名等用户信息。

      【讨论】:

      • 控制器是静态类,我如何访问控制器。用户无法访问它。 tnx
      • 不,Controller 不是静态类。您的控制器,即您的 AccountControllerLoginController,或您发布 Index 操作代码的任何控制器类 --- that 是一个控制器类。在该代码中,如果您已正确设置控制器以从 Controller 类继承,则可以使用 this.User,即 public class AccountController : Controller。如果你的代码没有从Controller 正确继承,我什至不知道你的代码将如何作为 MVC 控制器工作。
      猜你喜欢
      • 2014-01-11
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      相关资源
      最近更新 更多