2009-11-09 35 views
6

我是ASP.NET MVC 1.0的新手。我从使用VS2008 .NET3.5构建的经典应用程序进行转换。我创建了一个母版页,并且必须从数据库中读取菜单。现在,将经典ASP.NET3.5 VS2008中的HTML生成到相应菜单分区的代码位于母版页后面的代码中。ASP.NET MVC - 主页背后的代码

我现在无法理解母版页的代码在ASP.NET MVC 1.0中的位置?

任何人都有例子吗?

谢谢

回答

3

您的母版页现在是一个视图,视图应该是被动的。换句话说,他们不应该自己去查看事情。

这将是一个更正确的方法(在ASP.NET MVC的上下文中)从模型中提取所需的数据。

查看this SO question进行相关讨论。

+0

你有没有例子? – 2009-11-09 09:01:34

+0

更新了我的答案... – 2009-11-09 09:03:07

+0

我认为引用的例子,与ViewModel对象是有点矫枉过正的问题。 – 2009-11-09 09:14:06

7

在MVC中,不再有代码隐藏类。你想要的是部分。如果该菜单将是在所有的网页,你可以让你的控制器子类定制控制器类,总是先填充菜单数据

<% Html.RenderPartial("MainMenu.ascx", ViewData["Menu"]); %> 

你会使用它,像这样。

如果与MVC继承层次搞乱是矫枉过正,你也可以做出MenuController类,并在您的视图/主使用的RenderAction:

<% Html.RenderAction<MenuController>(x => x.MainMenu()); %> 
3

上有ASP.NET site一个伟大的教程,显示怎么办正是这个。

简而言之,您通过ViewData集合将数据传递到母版页。要将数据导入ViewData,请创建一个应用程序级别控制器。让页面控制器从应用程序控制器而不是基础MVC控制器继承。另外,如果您需要在您的母版页上对所显示的页面做出反应,则可以通过此应用程序控制器绑定到ActionExecuting事件中。这将为您提供有关当前正在处理的页面请求的上下文的信息。

+0

这是一个很棒的教程,很好的解释了Controller的扩展选项。 – 2009-11-10 02:54:13

6

如果需要,您仍然可以隐藏代码。在你的.master文件放:

<%@ Master Language="C#" AutoEventWireup="true" 
Inherits="Site_Master" CodeFile="Site.Master.cs" %> 

然后在您的.master.cs:

public partial class Site_Master : ViewMasterPage 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
    } 
} 
+2

你*可以*但请不要。 – 2009-11-10 02:52:23

+3

嗯,他问 - 我回答。此外,可能有一个法律案件,你永远不知道。 – 2009-11-10 04:11:37

+0

我喜欢你的风格。 :) – 2011-05-25 04:38:19

1

就个人而言,我更喜欢使用强类型的意见和的ViewModels。如果您的母版页需要数据,则为其创建一个ViewModel。确保每个页面的ViewModel都从这个基本的ViewModel继承。同样,创建一个每个其他控制器都从其继承的基本控制器。使用Action Filters可以确保主ViewModel隐式地填充。一个例子见this