部分视图难度ASP.NET MVC

时间:2011-12-26 12:15:27

标签: asp.net asp.net-mvc asp.net-mvc-3 session razor

在部分视图中,我必须访问包含Session对象的LoginInfo变量LoginInfo。我尝试了以下方法:

@LoginInfo info = @(LoginInfo)Session["LoginInfo"]

但它给了我编译器错误。我做错了什么?

1 个答案:

答案 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")