【问题标题】:What is the best way in MVC to share a Layout object with between multiple HTML Helpers在 MVC 中,与多个 HTML Helpers 共享 Layout 对象的最佳方式是什么
【发布时间】:2015-03-14 00:14:54
【问题描述】:

我是 .NET MVC 的新手,正在寻找这个问题的代码或非代码答案。我的 Web 应用程序将有数百个控制器、部分控制器等。所有控制器将共享一个公共布局。我目前正在从页面的控制器向 ViewBag 添加一个 Menu 对象。

我想知道在 MVC 布局视图中多次重用对象的最佳做法是什么(类似于下面我的示例中的 Menu 对象)?

@Html.Header(ViewBag.Menu as IR.Web.Portal.Models.Navigation.Menu)
@Html.SideNav(ViewBag.Menu as IR.Web.Portal.Models.Navigation.Menu)
@Html.Footer(ViewBag.Menu as IR.Web.Portal.Models.Navigation.Menu)
  1. 我只想初始化对象一次,但要多次使用。

  2. 我不想向每个控制器添加代码以使其工作。继承一个基本控制器可能是一个很好的解决方案。

  3. Menu 对象不需要像我的示例那样位于 ViewBag 中。

  4. Menu 对象对于网站的每个用户都是不同的。所以,Static 或 Singleton 类可能不在考虑之列。

【问题讨论】:

  • 在 Global.asax 中添加一个 GloablFilter?每个 Controller 都继承一个 Base Controller 吗?在用户会话中存储对象?创建自定义 pageBaseType?还有其他建议吗?

标签: c# model-view-controller controller


【解决方案1】:

身份验证和日志记录非常适合控制器基础。但是,我认为创建自定义 PageBaseType 也是一个好主意。页面应该做很多事情,但控制器不应该做...主题、徽标、布局、加载脚本、可能获取菜单等。

将以下内容添加到 \Views\Web.config:

<system.web.webPages.razor>
    <pages pageBaseType="MyPageBase">
</system.web.webPages.razor>

创建一个类:

public abstract class MyPageBase<T> : WebViewPage<T>
{
    protected override void InitializePage()
    {
        ViewBag.Menu = new Menu();
        base.InitializePage();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多