【问题标题】:Partial View difficulty ASP.NET MVC局部视图难度 ASP.NET MVC
【发布时间】:2012-01-27 23:18:30
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我做错了什么?\

    很多东西。您做错的第一件事是 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")
    

    【讨论】:

    • 我不明白 ChildActionOnly 和下面你能解释一下如何让会话在部分可见
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 2011-06-28
    相关资源
    最近更新 更多