如何在ASP.NET MVC中完成?

时间:2009-03-22 13:11:14

标签: asp.net asp.net-mvc webforms

我有一些ASP.NET MVC的经验,但只有一个Web应用程序,其中母版页的内容不会改变。我一直在想你将如何处理一个网站,例如从数据库加载菜单(在主页面上)。你会在哪里加载这些数据?

在WebForms中,您可以在母版页的代码隐藏中加载菜单,或者将菜单作为用户控件进行加载,并在代码隐藏中进行加载。但是这在MVC中完成了什么?

你是否创建了一个继承自Controller的类,用于所有控制器并让它在每次Action调用时加载菜单(我不知道这是否可能,但似乎可能)?

或者您是否创建了一个实用程序方法,您可以在每个您想要它的Action中调用它(因为某些Actions可能只返回一个不会重新加载菜单的部分视图),这虽然不是灾难性的 - 但似乎有点无聊。

或者你会对MVC犯罪并将其加载到母版页的代码隐藏中吗?

最好的方法是什么(当然不限于我的解决方案)?

4 个答案:

答案 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”命名空间才能生效。