ASP.NET MVC 2:母版页中的会话或TempData?

时间:2010-10-12 16:23:52

标签: asp.net-mvc master-pages

我的母版页中有一个div,只有在Session [“message”]包含数据时才会显示:

<%
    if (!String.IsNullOrEmpty(Session["message"].ToString()))
    {
%>        
        <div id="sessionMessage" class="sessionMessage"><%:Session["message"].ToString()%></div>
<%
    }
%>  

我使用它将一般信息传递给用户以获取操作成功和失败。

我在失败时对其进行了测试,效果很好。只需在catch块中设置Session [“message”]并返回视图的新实例:

{ 
   //Invalid - redisplay with errors
   Session.Add("message", "That object already exists.  Please try again.");
   return View(new DetailViewModel());            
}

问题:但是,对于涉及RedirectToAction的成功案例,当我到达母版页时,会话[“消息”]总是被清除:

//Send message to view for user to see
Session.Add("message", "Object added.");

//Redirect to the details
return RedirectToAction("Details", new { id = viewModel.MyObject.ObjectId });

我考虑过切换到TempData,但它会在初始页面加载时抛出null引用错误。我假设这是因为TempData是Controller类的成员,而Master Page本身没有控制器?

2 个答案:

答案 0 :(得分:3)

在母版页中使用TempData就可以了。但是如果TempData["message"]没有碰巧包含任何内容,那么在其上调用.ToString()会给你一个空的引用异常。 SessionTempData在这方面表现相同。这个原则的区别在于,TempData在您阅读时会被清除,而Session则不会。因此,您可能可能看到TempData的问题,但您的代码与其中任何一个都存在相同的潜在错误。

答案 1 :(得分:0)

我强烈建议您将TempData用于所有用户警报和通知功能。

会话可以永远保留,而TempData在读取后清除,或者在下一页加载后使用MVC 1。使用会话意味着您可以向用户提供您忘记清除的令人困惑的错误消息。