局部视图难度ASP.NET MVC
问题描述:
在局部视图中,我必须访问Session
变量LoginInfo
,它包含一个LoginInfo
对象。我试过以下内容:局部视图难度ASP.NET MVC
@LoginInfo info = @(LoginInfo)Session["LoginInfo"]
但它给我编译错误。我究竟做错了什么?
答
什么我做错了吗?\
许多事情。你做错的第一件事是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")
我不明白ChildActionOn您可以解释如何在部分内容中查看会话 – Demodave 2015-08-28 17:02:19