使用TempData,Session或静态变量在同一控制器中的ActionResults之间共享相同的值是否更好?

时间:2015-07-21 16:09:19

标签: c# asp.net-mvc

我有一个MVC控制器,我希望将相同的(静态)信息传递给相同控制器中的任何ActionResult,只能由同一用户在索引页面中的新选项进行更改。我已经读过使用静态变量被认为是不好的做法。我的网站在Intranet环境中使用Windows身份验证,任何时候最多可以有10个人查看任何一个页面。如果我理解我正确阅读的内容,那么静态变量可能会被页面用户以外的其他人覆盖,只需同时查看同一页面即可。

作为替代方案,我读到了“TempData”和“Session Variables”,但到目前为止我还没有看到任何指示这些方法是否能确保变量在Index页面中仅由查看该实例的人设置的内容。这页纸。我在下面粘贴了代码示例,显示了我的意思。我让他们工作,我的问题是哪种方法确保只有查看该页面实例的人设置并读取值?

此代码示例显示了控制器级静态变量的使用:

public class HomeController : Controller
{
    public static string _currentChoice;
    public ActionResult Index(string CurrentChoice)
    {
        _currentChoice = string.IsNullOrEmpty(CurrentChoice)?"nothing":CurrentChoice;
        ViewBag.Message = "Your choice is " + _currentChoice;
        return View();
    }

    public ActionResult About()
    {
        ViewBag.Message = "Your choice is still "+_currentChoice;
        return View();
    }
}

此代码示例使用 TempData 会话

public class HomeController : Controller
{     
    public ActionResult Index(string CurrentChoice)
    {
        var _currentChoice = CurrentChoice;
        _currentChoice = string.IsNullOrEmpty(CurrentChoice)?"nothing":CurrentChoice;
        TempData["CurrentChoice"] = _currentChoice;
        Session["SessionChoice"] = _currentChoice;
        ViewBag.Message = "Your choice is " + _currentChoice;
        return View();
    }

    public ActionResult About()
    {
        ViewBag.Message = "Your choice is still " + TempData["CurrentChoice"]
            + "\nYour Session choice is " + Session["SessionChoice"]; 
        return View();
    }
}

1 个答案:

答案 0 :(得分:9)

您将要使用会话。您提供的每个选项都有不同的用例:

  • 静态变量对每个类的实例使用相同的变量。这意味着每个用户都会看到相同的值,如果一个用户更改了该变量,则所有其他用户都会更改。由于您希望每个用户都是唯一的,因此这不是一个选项。
  • TempData 用于在重定向期间传递数据,根据this answer
  • 会话数据用于存储当前会话的数据,并且每个用户都是唯一的。