设为首页收藏本站language 语言切换
查看: 1751|回复: 0
收起左侧

DIY“ASP.NET MVC 嵌套的母版页”项模板

[复制链接]
发表于 2010-2-25 10:51:29 | 显示全部楼层 |阅读模式
<p >相信不少人与文超一样需要一个MVC“嵌套的母版页”项模板,嵌套的母版有助于细致规划页面公共部分(尤其是要求一改全改的地方),但是目前官方的MVC项模板中尚未提供。而事实上制作一份项模板是相当简单的,文超懒怠成性,遂以先在网上搜索一番,希望有现成的以飨懒人,未果,于是“自己动手,丰衣足食”吧。<p ><p >先来看看最终结果吧:那么接下来文超将介绍两点,共四种方法:<p ><p ><center><img  src="http://www.hh010.com/upload_files/article/244/9_joxgyl1840107.jpg"></center><p ><p >安装完后您将看到 MVC 节点下多了一个 “MVC View 嵌套的母版页”模板,嗯,中文字在英文堆里特别显眼。<p ><p >一是大众做法,敲多两行代码,忍着点也能活,等微软的更新(三种);<p ><p >二是文超写文章的目的所在:使用自制的土枪。<p ><p >文超所指的是在MVC尚未提供而又想要得到“嵌套的母版页”一样的效果时的做法。其实如大家所知,要在 MVC 下实现这功能相当简单,为方便演示例子,文超对默认的MVC项目里的 site.master 进行了人工改造,在母版里加了几个 ContentPlaceHolder:<p ><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>&lt;%@ Master Language=&quot;C#&quot; Inherits=&quot;System.Web.Mvc.ViewMasterPage&quot; %&gt;&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;&lt;head runat=&quot;server&quot;&gt;    &lt;title&gt;&lt;asp:ContentPlaceHolder ID=&quot;TitleContent&quot; runat=&quot;server&quot; /&gt;&lt;/title&gt;    &lt;link href=&quot;http://www.cnblogs.com/Content/Site.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;    &lt;asp:ContentPlaceHolder ID=&quot;HeaderContent&quot; runat=&quot;server&quot; /&gt;&lt;/head&gt;&lt;body&gt;    &lt;div&gt;        &lt;h1&gt;这儿是头&lt;/h1&gt;        &lt;div&gt;            &lt;asp:ContentPlaceHolder ID=&quot;BodyContent&quot; runat=&quot;server&quot; /&gt;            &lt;h1&gt;这儿是其他内容&lt;/h1&gt;        &lt;/div&gt;        &lt;h1&gt;这儿是脚&lt;/h1&gt;    &lt;/div&gt;&lt;/body&gt;&lt;/html&gt;</ccid_code></pre></td></tr></table></ccid_nobr><br><p ><p ><b>方法一</b><p ><p >接着文超再在 Views\Shared 下新建一个 Article.Master 母版:<p ><p ><center><img  src="http://www.hh010.com/upload_files/article/244/9_4h27al1840109.jpg"></center><p ><p >要让 Article.Master作为 Site.Master 的嵌套母版,只需要将首行的 <%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %> 加入 MasterPageFile 属性,并将其值填入指定嵌套的母版,并去掉所有 HTML 代码,敲入与嵌套母版 site.master 中的 ContentPlaceHolder 对应一致的 Content 即可,按文超的例子,去掉了首行声明以外的所有 HTML 以后,并厌恨其烦地敲了这些代码,Article.Master 应该长成这样:<p ><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>&lt;%@ Master Language=&quot;C#&quot; MasterPageFile=&quot;~/Views/Shared/Site.Master&quot; Inherits=&quot;System.Web.Mvc.ViewMasterPage&quot; %&gt;&lt;asp:Content ID=&quot;Content1&quot; ContentPlaceHolderID=&quot;TitleContent&quot; runat=&quot;server&quot;&gt;&lt;/asp:Content&gt;&lt;asp:Content ID=&quot;Content2&quot; ContentPlaceHolderID=&quot;HeaderContent&quot; runat=&quot;server&quot;&gt;&lt;/asp:Content&gt;&lt;asp:Content ID=&quot;Content3&quot; ContentPlaceHolderID=&quot;CSSContent&quot; runat=&quot;server&quot;&gt;&lt;/asp:Content&gt;&lt;asp:Content ID=&quot;Content4&quot; ContentPlaceHolderID=&quot;BodyContent&quot; runat=&quot;server&quot;&gt;&lt;/asp:Content&gt;</ccid_code></pre></td></tr></table></ccid_nobr><br><p ><p ><b>方法二</b><p ><p >这也是文超之前使用的办法,使用ViewContentPage你可以免除了敲入这部分代码的劳累:<p ><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>&lt;asp:Content ID=&quot;Content1&quot; ContentPlaceHolderID=&quot;TitleContent&quot; runat=&quot;server&quot;&gt;&lt;/asp:Content&gt;&lt;asp:Content ID=&quot;Content2&quot; ContentPlaceHolderID=&quot;HeaderContent&quot; runat=&quot;server&quot;&gt;&lt;/asp:Content&gt;&lt;asp:Content ID=&quot;Content3&quot; ContentPlaceHolderID=&quot;CSSContent&quot; runat=&quot;server&quot;&gt;&lt;/asp:Content&gt;&lt;asp:Content ID=&quot;Content4&quot; ContentPlaceHolderID=&quot;BodyContent&quot; runat=&quot;server&quot;&gt;&lt;/asp:Content&gt;</ccid_code></pre></td></tr></table></ccid_nobr><br><p ><p >但是你要做两件事情:<p ><p >1.ViewContentPage 生成的文件名扩展名是 aspx,你需要将它修改为 master 扩展名。<p ><p >2.修改首行的 page 指令为 master 指令,例如:<p ><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>&lt;%@ Master Language=&quot;C#&quot; MasterPageFile=&quot;~/Views/Shared/Site.Master&quot; Inherits=&quot;System.Web.Mvc.ViewMasterPage&quot; %&gt;</ccid_code></pre></td></tr></table></ccid_nobr><br><p ><p ><b>方法三</b><p ><p >方法三是使用 ASP.NET WebForm 的“嵌套的母版”模板,这个大家应该都很熟悉,你可能要做的也是两件事情:<p ><p >1.将多余的 master.cs 及 designer.cs 删掉。<p ><p >2.将首行的多余属性去掉,将 Inherits 属性值设置为: System.Web.Mvc.ViewMasterPage<p ><p ><b>方法四</b><p ><p >这是本文的核心所在,这种方法使用自制模板,一次性填补上述三种方法的不足,既不用如方法一那样敲键盘,也不用像方法二那样修改 master 指令,更不用像方法三那样删文件,一劳永逸,一箭三雕,一石三鸟,一举三得。的的确确、确确实实、实实在在让文超舒心,首先文超在这个目录下(MVC项模板目录):<p ><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>&quot;C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\ItemTemplates CSharp\Web\MVC&quot;</ccid_code></pre></td></tr></table></ccid_nobr><br><p ><p >找到这个压缩文件:<p ><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>MvcViewContentPageItemTemplatev1.cs.zip</ccid_code></pre></td></tr></table></ccid_nobr><br><p ><p >其实这就是方法二所使用的MVC View Content Page项模板,解压到任意一个文件夹(文超解压到桌面去了,文超的桌面非常的乱,我相信大部分程序员的桌面都是乱的一团糟的),<p ><p >你将得到两样东西:<p ><p >1. Views 文件夹<p ><p >2. MvcViewNestedMasterPageItemTemplatev1.cs.vstemplate <p ><p >这份文件正是模板定义,是一份 XML 文件。接下来进行人工改造,改造的结果是这样: <p ><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>&lt;VSTemplate Version=&quot;3.0.0&quot; xmlns=&quot;  http://schemas.microsoft.com/developer/vstemplate/2005&quot; Type=&quot;Item&quot;&gt;  &lt;TemplateData&gt;    &lt;DefaultName&gt;ViewNestedMasterPage.Master&lt;/DefaultName&gt;    &lt;Name Package=&quot;{DC519505-FBF8-48c7-AAA5-F27B0405F278}&quot; ID=&quot;21106&quot;&gt;      MVC View 嵌套的母版页&lt;/Name&gt;    &lt;Icon Package=&quot;{39c9c826-8ef8-4079-8c95-428f5b1c323f}&quot; ID=&quot;4709&quot;/&gt;    &lt;Description Package=&quot;{DC519505-FBF8-48c7-AAA5-F27B0405F278}&quot; ID=&quot;21107&quot;&gt;     MVC View 继承自其他母版页的母版页&lt;/Description&gt;    &ltrojectType&gt;CSharp&lt;/ProjectType&gt;    &lt;SortOrder&gt;10&lt;/SortOrder&gt;    &lt;SupportsMasterPage&gt;true&lt;/SupportsMasterPage&gt;    &lt;NumberOfParentCategoriesToRollUp&gt;2&lt;/NumberOfParentCategoriesToRollUp&gt;     &lt;RequiredFrameworkVersion&gt;3.5&lt;/RequiredFrameworkVersion&gt;    &lt;TemplateGroupID&gt;MVC&lt;/TemplateGroupID&gt;     &lt;ShowByDefault&gt;false&lt;/ShowByDefault&gt;  &lt;/TemplateData&gt;  &lt;TemplateContent&gt;    &lt;CustomParameters&gt;      &lt;CustomParameter Name=&quot;$language$&quot; Value=&quot;C#&quot; /&gt;      &lt;CustomParameter Name=&quot;$SelectMaster$&quot; Value=&quot;true&quot; /&gt;      &lt;CustomParameter Name=&quot;$viewdatatype$&quot; Value=&quot;&quot; /&gt;      &lt;CustomParameter Name=&quot;$usingviewdatatype$&quot; Value=&quot;&quot; /&gt;      &lt;CustomParameter Name=&quot;$ParentExtension$&quot; Value=&quot;.master&quot;/&gt;      &lt;CustomParameter Name=&quot;$ChildExtension$&quot; Value=&quot;.cs&quot;/&gt;    &lt;/CustomParameters&gt;    &lt;References /&gt;    &ltrojectItem SubType=&quot;&quot; TargetFileName=&quot;$fileinputname$.Master&quot;     ReplaceParameters=&quot;true&quot;&gt;Views\Home\ViewNestedMasterPage.Master&lt;/ProjectItem&gt;  &lt;/TemplateContent&gt;  &lt;WizardExtension&gt;    &lt;Assembly&gt;Microsoft.VisualStudio.Web.Extensions, Version=9.0.0.0, Culture=neutral,     PublicKeyToken=31bf3856ad364e35&lt;/Assembly&gt;    &lt;FullClassName&gt;Microsoft.VisualStudio.Web.Mvc.ItemTemplateWizard&lt;/FullClassName&gt;  &lt;/WizardExtension&gt;&lt;/VSTemplate&gt;</ccid_code></pre></td></tr></table></ccid_nobr><br><p ><p >第二步进入到 Views\Home,找到ViewContentPage.aspx 文件,将其删除,然后在此文件夹内创建一份 master 文件,据MvcViewNestedMasterPageItemTemplatev1.cs.vstemplate 的改造结果,这份文件需要命名为:ViewNestedMasterPage.Master,这份 master 文件的内容如下: <p ><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>&lt;%@ Master Language=&quot;C#&quot;  MasterPageFile=&quot;$MasterPage$&quot; Inherits=&quot;System.Web.Mvc.ViewMasterPage&quot; %&gt;$ContentTags$</ccid_code></pre></td></tr></table></ccid_nobr><br><p ><p >第三步改完后将其压缩为 ZIP 压缩包(选中 Views 文件夹和 MvcViewNestedMasterPageItemTemplatev1.cs.vstemplate 后右击->发送到->压缩(zipped)文件夹)为它起个统一风格的名字:MvcViewNestedMasterPageItemTemplatev1.cs.zip<p ><p >因为时间关系文超已经制作好这份文件了,点击此处下载,接着你只需要从第四步开始。<p ><p >第四步将ZIP文件复制到刚才 ViewContentPage 项模板同一位置:<p ><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>&quot;C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\ItemTemplates CSharp\Web\MVC&quot;</ccid_code></pre></td></tr></table></ccid_nobr><br><p ><p >第五步添加项模板到 VS :<p ><p >无论你是用 CMD 还是在VS的快捷方式上(别忘记安装完后设置回原来路径)修改都可以,你需要使用 setup 选项将创建的项模板添加到 VS 中去,执行下面命令行:<p ><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>&quot;C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\devenv.exe&quot; /setup</ccid_code></pre></td></tr></table></ccid_nobr><br><p ><p >最后,安装完后使用方法与Web Form的嵌套的母版页是一样的,enjoy yourself。<p ><p >< align=right></P><p align="center"></p></p>
您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-4-10 15:54 , Processed in 0.162199 second(s), 24 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表