在 MVC 中,与多个 HTML Helpers 共享 Layout 对象的最佳方式是啥
Posted
技术标签:
【中文标题】在 MVC 中,与多个 HTML Helpers 共享 Layout 对象的最佳方式是啥【英文标题】: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)
我只想初始化对象一次,但要多次使用。
我不想向每个控制器添加代码以使其工作。继承一个基本控制器可能是一个很好的解决方案。
Menu 对象不需要像我的示例那样位于 ViewBag 中。
Menu 对象对于网站的每个用户都是不同的。所以,Static 或 Singleton 类可能不在考虑之列。
【问题讨论】:
在 Global.asax 中添加一个 GloablFilter?每个 Controller 都继承一个 Base Controller 吗?在用户会话中存储对象?创建自定义 pageBaseType?还有其他建议吗? 【参考方案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();
【讨论】:
以上是关于在 MVC 中,与多个 HTML Helpers 共享 Layout 对象的最佳方式是啥的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET MVC 4 自定义 HTML Helpers 文件夹位置
HTML Helpers DropDownList On change Jquery Event filter another DropDownList?附上 MVC 示例
Tag Helpers - 自关闭 HTML 标签是个坏习惯?
(转)MVC语法-@helpers和@functions(Razor内定义函数)
使用整体模型模板辅助器 Using Whole-Model Templated Helpers 模板辅助器方法 精通ASP.NET MVC 5