我有一些ASP.NET MVC的经验,但只有一个Web应用程序,其中母版页的内容不会改变。我一直在想你将如何处理一个网站,例如从数据库加载菜单(在主页面上)。你会在哪里加载这些数据?
在WebForms中,您可以在母版页的代码隐藏中加载菜单,或者将菜单作为用户控件进行加载,并在代码隐藏中进行加载。但是这在MVC中完成了什么?
你是否创建了一个继承自Controller
的类,用于所有控制器并让它在每次Action调用时加载菜单(我不知道这是否可能,但似乎可能)?
或者您是否创建了一个实用程序方法,您可以在每个您想要它的Action中调用它(因为某些Actions可能只返回一个不会重新加载菜单的部分视图),这虽然不是灾难性的 - 但似乎有点无聊。
或者你会对MVC犯罪并将其加载到母版页的代码隐藏中吗?
最好的方法是什么(当然不限于我的解决方案)?
答案 0 :(得分:1)
ActionFilter
用于拦截请求并进行一些处理。你可以使用它们。
这是对MVC模式的罪吗?
您在某种程度上打破了MVC模式。但更高层次的观点是:如果你强迫自己不打破它,它会提供更多的价值吗?我认为这不会给你带来太多麻烦,所以请记住简单性和可维护性,并选择在特定情况下的方式。
答案 1 :(得分:1)
答案 2 :(得分:0)
我会创建一个主页面从中获取数据的模型类型。然后从MasterModel派生页面的模型类型。
控制器填充PageModel的一个实例,主页面将其选中。
(或者,母版页的模型可以是页面模型实现的界面。)
NB。在MVC中,CTP执行此操作需要一些中间类来覆盖类型匹配以获取基类数据。我不知道这是否已在RTM中修复。
答案 3 :(得分:0)
ASP.NET MVC Futures程序集(more info here)包含一个扩展方法,允许您在母版页中执行此操作:
<% Html.RenderAction<NavigationController>(c => c.Show()); %>
您需要引用程序集并在web.config文件中添加“Microsoft.Web.Mvc”命名空间才能生效。