我已经通过使用NuGet包解决了这个问题。它们可以像你需要它们一样复杂或简单。通过手动创建.nuspec file,使用command line tool构建基本母版页并将其托管在文件系统(本地或网络)上即可实现基本母版页布局。
一个配置文件添加到您的模板项目的根 - 把它template.nuspec并添加以下内容:
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>MyAppTemplate</id>
<version>1.0.0</version>
<description>A template web application</description>
<authors>Me or my company</authors>
</metadata>
<files>
<file src="Site.Master" target="content\Site.Master" />
<file src="Site.Master.cs" target="content\Site.Master.cs" />
<file src="Site.Master.designer.cs" target="content\Site.Master.designer.cs" />
</files>
</package>
注目标是“内容” - 这将在该项目中删除主页NuGet软件包的安装位置。您可能也希望将母版页的命名空间更改为$rootnamespace$
,因为这样会做source code transformation,这将使母版页成为与项目其余部分相同的命名空间的一部分。
在命令行,然后你可以只调用nuget.exe pack path\to\nuspec\file
,这将导致创建.nupkg
文件。对于本地开发,我通常会把它放在C:\NuGet\Local
,尽管这可能是网络共享\\MyShare\InternalNuget
或者如果您想进一步研究,可以使用如ProGet或TeamCity的解决方案。
然后在Visual Studio中,您可以将其添加为包源:
工具 - > NuGet包管理器 - >软件包管理器设置 - >软件来源
点击加号并添加您的文件夹/ unc路径/ url,然后您可以在任何其他项目中重复使用它。
作为一般规则,最好在创建项目时允许NuGet覆盖现有的Site.Master,然后不要编辑文件,因为这允许您使用NuGet软件包版本控制集中管理更改。但是,如果您希望进行项目特定的更改,那么您只需记住不要让NuGet包在后续更新中覆盖项目版本。
您可以在模板项目中包含所有类型的文件。这包括.ascx
用户控件,css和javascript文件以及编译或未编译的基本页面(继承自System.Web.UI.Page
)。可能性是无止境。使用<asp:contentplaceholder/>
和适当的CSS,可以通过用户控件在大多数项目中使用通用菜单,但仍然可以将其替换为其他项目中更复杂的菜单,而无需修改主模板。
编辑:
我想这可能是可能的通过拆分包装分成两个部分来实现(至少对于相对简单的内容)所需的效果。第一个是包含母版页的NuGet包。该母版页可以包含图表中页眉和页脚的iframe,常见样式和javascript的内容占位符以及CSS和脚本标签。
包装的第二部分将是一个单独的应用程序,托管iframe和.css和.js文件的内容。像添加一个新的JavaScript库这样的重大更改仍然需要更新主页面,但是通过更改包装文件并重新发布,可以实现诸如添加新函数或CSS类或更改品牌或徽标等小改动。有点像托管自己的简单CDN。
母版页是这样的:
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="$rootnamespace$.SiteMaster" %>
<html>
<head runat="server">
<title><%: Page.Title %></title>
<link href="https://example.com/mywrapperapplication/styles/mywrapper.css" rel="stylesheet" />
</head>
<body>
<iframe src="https://example.com/mywrapperapplication/header.html" />
<form runat="server">
<asp:ContentPlaceHolder ID="MenuContent" runat="server"></asp:ContentPlaceHolder>
<asp:ContentPlaceHolder ID="BodyContent" runat="server"></asp:ContentPlaceHolder>
</form>
<iframe src="https://example.com/mywrapperapplication/footer.html" />
<script type="text/javascript" src="https://example.com/mywrapperapplication/scripts/mywrapper.js"></script>
</body>
</html>
然后你有静态内容或一个简单的应用程序有4个(或以上)文件部署在https://example.com/mywrapperapplication
:
header.html --or aspx or whatever
footer.html
/scripts/mywrapper.js
/styles/mywrapper.css
任何变化您对这些文件中的任何文件进行制作时,都将自动在包装应用程序中传播,因为它们是从母版页链接的。你只需要重新发布的包装应用程序,如果你想添加一个额外的文件,例如
<link href="https://example.com/mywrapperapplication/styles/mynewstyles.css" rel="stylesheet" />
你能不能简单地说出你正在做的事情吗? – Webruster
@Webruster好吧,如果我想创建一个web应用程序,通常我会在同一个项目中创建一个母版页并使用它。现在我不想做因为我有很多Web应用程序必须使用相同的母版页,所以我想重复使用它并为此主包装器创建单独的项目,所以如果我在此包装器中更改某些内容,则不必更改全部内容我的Web应用程序使用它并发布所有这些应用程序。简单地说,我想要一个例子来澄清这个想法(包装与我的问题中的细节)和(任何Web应用程序应该使用这个包装)之间的整合。 –
@Webruster:你能告诉我你是否想要更多细节吗? –