Dra*_*gan 0 asp.net asp.net-mvc session razor asp.net-mvc-3
在局部视图中,我必须访问保存对象的Session变量.我尝试了以下方法:LoginInfoLoginInfo
@LoginInfo info = @(LoginInfo)Session["LoginInfo"]
Run Code Online (Sandbox Code Playgroud)
但它给了我编译器错误.我究竟做错了什么?
Dar*_*rov 14
我究竟做错了什么?\
许多事情,许多东西.你做错的第一件事是Razor语法.它应该是:
@{ LoginInfo info = (LoginInfo)Session["LoginInfo"]; }
Run Code Online (Sandbox Code Playgroud)
但那只是语法.你有一个更大的问题.你有一个设计问题.你违反了MVC模式.
视图不应尝试获取任何数据.视图使用以视图模型的形式从控制器操作传递给它的数据.
所以你定义了一个视图模型:
public class MyViewModel
{
public LoginInfo LoginInfo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后你有一个控制器动作:
public ActionResult Foo()
{
var model = new MyViewModel();
model.LoginInfo = (LoginInfo)Session["LoginInfo"];
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
然后你有一个强类型视图,你在其中使用视图模型:
@model MyViewModel
<div>Hello @Model.LoginInfo.FirstName</div>
Run Code Online (Sandbox Code Playgroud)
但在这种情况下(给定类的名称LoginInfo),我想你试图在所有视图上显示一些常见的小部件.这将是使用Html.Action助手的一个很好的候选人.
因此,您定义将从某些数据源获取此信息的控制器操作(在您的情况下为Session):
[ChildActionOnly]
public ActionResult LoginInfo()
{
var model = (LoginInfo)Session["LoginInfo"] ?? new LoginInfo();
return PartialView(model);
}
Run Code Online (Sandbox Code Playgroud)
然后你定义一个相应的部分:
@model LoginInfo
<div>Hello @Model.FirstName @Model.LastName</div>
Run Code Online (Sandbox Code Playgroud)
最后在你的_layout中你可以在某处包含这个小部件:
@Html.Action("LoginInfo", "SomeController")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1371 次 |
| 最近记录: |