【发布时间】:2012-01-27 23:18:30
【问题描述】:
在部分视图中,我必须访问Session 变量LoginInfo,它包含一个LoginInfo 对象。我尝试了以下方法:
@LoginInfo info = @(LoginInfo)Session["LoginInfo"]
但它给了我编译器错误。我做错了什么?
【问题讨论】:
标签: asp.net asp.net-mvc asp.net-mvc-3 session razor
在部分视图中,我必须访问Session 变量LoginInfo,它包含一个LoginInfo 对象。我尝试了以下方法:
@LoginInfo info = @(LoginInfo)Session["LoginInfo"]
但它给了我编译器错误。我做错了什么?
【问题讨论】:
标签: asp.net asp.net-mvc asp.net-mvc-3 session razor
我做错了什么?\
很多东西。您做错的第一件事是 Razor 语法。应该是:
@{ LoginInfo info = (LoginInfo)Session["LoginInfo"]; }
但这只是语法。你有一个更大的问题。你有一个设计问题。您违反了 MVC 模式。
视图不应尝试获取任何数据。视图使用从控制器操作以视图模型形式传递给它的数据。
所以你定义了一个视图模型:
public class MyViewModel
{
public LoginInfo LoginInfo { get; set; }
}
那么你有一个控制器动作:
public ActionResult Foo()
{
var model = new MyViewModel();
model.LoginInfo = (LoginInfo)Session["LoginInfo"];
return View(model);
}
那么你就有了一个强类型的视图,你可以在其中使用视图模型:
@model MyViewModel
<div>Hello @Model.LoginInfo.FirstName</div>
但是在这种情况下(给定类的名称LoginInfo)我想您正试图在所有视图上显示一些通用小部件。这将是使用 Html.Action helper 的绝佳候选者。
因此,您定义了将从某些数据源(在您的情况下为会话)获取此信息的控制器操作:
[ChildActionOnly]
public ActionResult LoginInfo()
{
var model = (LoginInfo)Session["LoginInfo"] ?? new LoginInfo();
return PartialView(model);
}
然后你定义一个对应的部分:
@model LoginInfo
<div>Hello @Model.FirstName @Model.LastName</div>
最后,您可以在您的 _layout 中将这个小部件包含在某处:
@Html.Action("LoginInfo", "SomeController")
【讨论】: