【发布时间】:2013-12-17 10:23:49
【问题描述】:
我想在多个 ASP.NET MVC 项目之间共享布局(页眉、导航和页脚 Razor 视图)。我该怎么做?
我可以创建一个自定义的NuGet 包来包装常见的 Razor 文件、图像和 CSS 吗?
【问题讨论】:
标签: asp.net-mvc razor
我想在多个 ASP.NET MVC 项目之间共享布局(页眉、导航和页脚 Razor 视图)。我该怎么做?
我可以创建一个自定义的NuGet 包来包装常见的 Razor 文件、图像和 CSS 吗?
【问题讨论】:
标签: asp.net-mvc razor
我现在通过 Google 不止一次遇到过这个问题,尽管我会提出另一个解决方案(IMO,它比使用预编译器和包更安全、更易于管理)。
事实上,我已经无耻地逐字抄袭了 Erik Phillips 的回答,所以请感谢他。
他说了什么...(他特别针对 javascript 文件这样说,但这与任何其他类型一样有效)source answer
以下是我的建议:
右键单击解决方案并创建一个名为Common Javascript Files(或任何您喜欢的名称)的新解决方案文件夹。
右键单击解决方案,单击在 Windows 资源管理器中打开文件夹, 或手动导航到其他版本的 Visual Studio :(
在解决方案目录中,创建一个与解决方案文件夹同名的目录(解决方案文件夹通常与源代码级别的目录不匹配,但这是为了保持理智)。
在这个新目录中,添加需要在解决方案之间共享的文件。
在 Visual Studio 中,单击解决方案文件夹并选择添加 - 现有项。
在文件选择对话框中,导航到之前创建的目录,选择添加到目录中的文件并单击添加。
在每个需要共享文件的项目中,右键单击项目(或项目内的目录),然后单击添加 - 现有项。
导航到共享目录,选择文件并单击下拉箭头,然后单击添加为链接。
现在项目中的文件基本上是解决方案文件夹中文件的快捷方式。但它们被视为项目中的实际文件(这包括 .CS 或 Visual Basic 文件,它们将被编译为项目中实际存在的文件)。
优点
缺点
并且 - 从另一个答案中窃取信息以整合信息,这是您如何将这些结果输出以进行调试(取自已抓取答案下方的评论,link to blog post for build target for output for debugging)
将此添加到每个使用项目的.csproj 文件中:
<Target Name="CopyLinkedContentFiles" BeforeTargets="Build">
<Copy SourceFiles="%(Content.Identity)"
DestinationFiles="%(Content.Link)"
SkipUnchangedFiles='true'
OverwriteReadOnlyFiles='true'
Condition="'%(Content.Link)' != ''" />
</Target>
【讨论】:
三种方法:
请参阅 Compile your ASP.NET MVC Razor views into a separate DLL,了解如何执行选项 2。
对于选项 3,请参阅 Creating and Publishing a Package。
其实我觉得这是关于如何编译Razor视图的原创文章:Precompile your MVC Razor views using RazorGenerator
【讨论】:
有更好的新选项(恕我直言)。
我会利用 优势 在 ASP MVC Core 中将其组织为 Feature splices,这样可以节省大量时间,我会分两步推荐它。
首先,组织/放置一个名为Features拼接MSDN ref的区域。 按照文章中的方式将其连接起来并得到很好的解释。
// you're telling ASP that you've other Feature areas that it should look
public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context,
IEnumerable<string> viewLocations)
{
// Error checking removed for brevity
var controllerActionDescriptor = context.ActionContext.ActionDescriptor as ControllerActionDescriptor;
string featureName = controllerActionDescriptor.Properties["feature"] as string;
foreach (var location in viewLocations)
{
yield return location.Replace("{3}", featureName);
}
}
第二,嵌入
Shared project 或 Portable Libraries。我附上了链接
R. Williams 和 MSDN 如何做到这一点。
总而言之,由于您已经在公共区域中拥有它,因此将其视为一项功能并将其嵌入到 portable lib or a Shared Project 中。 R. Williams 的一篇不错的文章。
【讨论】: