在部分视图中,我必须访问包含Session
对象的LoginInfo
变量LoginInfo
。我尝试了以下方法:
@LoginInfo info = @(LoginInfo)Session["LoginInfo"]
但它给了我编译器错误。我做错了什么?
答案 0 :(得分:14)
我做错了什么?\
很多事情。你做错的第一件事是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来说是个很好的选择。
因此,您定义将从某些数据源(在您的情况下为Session)中获取此信息的控制器操作:
[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")