繁体   English   中英

asp.net mvc保持对象活着,信息

[英]asp.net mvc keep object alive, information

我有这个代码

[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;

混乱

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

回答

这是因为您已经读取了TempData键,一旦读取了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适用于新的Tabs / Windows,就像Session变量一样。

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

希望这篇文章能帮到你。

一旦用户通过身份验证,您只需要存储用户的身份(用户名) - 不需要密码。 因此,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

TempData仅适用于一个请求。 因此,当您发出第二个请求时它是空的。 如果您想这样做,您应该使用Session或者您可以查看表单身份验证

您还应该考虑VinayC建议,不要在任何州存储任何密码信息,特别是不以明文格式存储。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM