在会话中保存模型并在视图中使用它

时间:2015-12-03 19:54:05

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

我一直在查看本网站上关于将模型数据保存到会话的一些答案,但似乎没有一个对我有用,或者很可能我没有正确理解它并且不确定如何实现它。 / p>

这是我一直在尝试的最新解决方案。 c# - How to save object to session in ASP.NET

在索引中,我在声明模型告诉我用户不存在时收到错误

模型

public class User
{
    public int Id { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
}

控制器

public ActionResult Index()
{
    using (DefaultConnection db = new DefaultConnection())
    {
        var model = from u in db.Users select u;

        var vm = (User)Session["User"];

        return View(vm);
    }
}

查看

@model User

@Model.Username

4 个答案:

答案 0 :(得分:1)

我不太清楚你想在这里实现什么。但我可以在你的代码中看到一些问题

var vm = (User)Session["User"];

您正尝试使用密钥User访问会话变量,并尝试将其强制转换为User实例。这意味着,在执行此代码之前,您应该将有效的用户对象设置为Session [" User"]。如果你不这样做,你的演员表会失败(代码会崩溃),因为Session没有键的任何项目" User"

如果尚未设置,则在访问此会话对象之前,应将有效的User对象设置为会话。

var us = new User { Id=1, Username="test"};
Session["User"] = us;

稍后,在从会话项访问之前,应始终检查它是否为空

User u = null;
if(Session["User"]!=null)
{
  u = Session["User"] as User;
  // you may use u now.
}

此外,您正在查询Users表并选择记录 s 到变量model。但是你没有在代码中的任何地方使用它。我不确定你为什么要那样做。

我不确定你为什么要使用session。如果您尝试在操作方法之间传递数据以查看,还有其他更好的解决方案,例如使用viewmodel(首选),ViewBag等。

记住会话数据可用于当前会话的整个应用程序,而不仅仅是一个页面。明智地使用它。

答案 1 :(得分:0)

为了将模型保存到Session,您需要先设置会话对象,例如

using (DefaultConnection db = new DefaultConnection())
{
    var model = from u in db.Users select u;
    Session["User"] = model; //Part where you set / save into the session 
    var vm = Session["User"] as User; //Part where you retrieve into the session
    return View(vm);
}

答案 2 :(得分:0)

User user = Session["User"] as User;
if ( user == null) user = new User();

答案 3 :(得分:0)

如果要在视图上访问ViewModel,可以通过多种方式执行此操作,一种方法是将视图与模型关联(称为强类型视图)。您可以在视图中执行此操作:

@model type @*Associate your view to a ViewModel, where type is your ViewModel Class*@

<h1>@Model.Name</h1> @*access the properties of your view using @Model *@

@model用于将模型与视图相关联,而@Model用于访问视图的关联模型。我建议你先阅读ASP.NET MVC的工作原理。您可以访问ASP.NET MVC tutorial on views