部分视图难度ASP.NET MVC

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)