动机
我希望能够在Javascript中建立一个类似树形的对象层次结构,该结构对应于ASP.NET MVC 3 Razor页面上的视图。计划是将Razor视图与Javascript文件一一对应,其中定义了其逻辑(以接受一些初始化参数的构造函数的形式)。简单的示例可能如下:
_Layout.cshtml <-> Global.js
SplitterPane.cshtml <-> SplitterPane.js
Grid.cshtml <-> Grid.js
Tree.cshtml <-> Tree.js
我将使用这些构造函数来构建层次结构,例如:
var page = new Global(global_options);
var splitter = new SplitterPane(splitter_options);
var grid = new Grid(grid_options);
var tree = new Tree(tree_options);
page.addChild(splitter);
splitter.addChild(grid);
splitter.addChild(tree);
所有这些代码当然应该在从部分视图收集的元数据的上下文中自动构建,以根(布局)视图。视图提供的元数据包含初始化其Javascript对象所需的选项以及要加载的Javascript文件。
问题:
与WebForms不同,MVC视图没有我知道的任何自然层次结构,而在视图和其部分(子)视图之间传递信息似乎相当棘手。如果在视图中使用类似Html.Action的帮助程序,则整个“子视图”的处理都是独立进行的,因此它们甚至不共享Page对象。我需要的是一种集中的地方,视图可以在呈现时存储其元数据,以便在布局视图中使用它来组合和输出完整的脚本。
解决方法?
我能想到的一种方式是使用HttpContext.Current.Items暂时存储视图元数据对象的集合。所有视图都会将元数据存入其中,并且布局视图将使用它。执行顺序似乎符合我的期望,但是我仍然无法重构视图树层次结构。为了能够做到这一点,我需要使用堆栈,在渲染开始时注册视图,并在结束时取消注册,以便可以在顶部找到父级。
1. 是否有一种方法可以使用某些预-/后渲染挂钩放置此逻辑? 2. 这首先是个好主意吗? 3. 是否有完全不同的解决方案,我看不见?