我想在多个ASP.NET MVC项目中共享布局(Header,Navigation和Footer Razor视图)。我怎么能这样做?
我可以创建一个自定义NuGet包来包装常见的Razor文件,图像和CSS吗?
答案 0 :(得分:17)
我现在不止一次通过Google发现这个问题,虽然我提出了另一种解决方案(IMO比使用预编译器和软件包更安全,更易于管理)。
事实上,我已经无耻地从Erik Phillips那里逐字逐句地回答,所以请相信他。
他说的是什么......(他特别说这是针对javascript文件的,但是对于任何其他类型都可以这样做)source answer
以下是我的建议:
右键单击解决方案并创建一个名为Common Javascript Files
的新解决方案文件夹(或者您想要调用它的任何内容。
右键单击解决方案,在Windows资源管理器中单击打开文件夹, 或者手动浏览其他版本的Visual Studio :(
在解决方案目录中,创建一个与解决方案文件夹同名的目录(解决方案文件夹通常不匹配源代码级别的目录,但这样做是出于理智的考虑)。
在此新目录中,添加需要在解决方案之间共享的文件。
在Visual Studio中,单击解决方案文件夹,然后选择添加 - 现有项。
在文件选择对话框中,导航到上一个创建的目录,选择添加到目录中的文件,然后单击添加。
在需要共享文件的每个项目中,右键单击项目(或项目中的目录),然后单击添加 - 现有项。
导航至共享目录,选择文件并单击下拉箭头,然后单击添加为链接。
现在,项目中的文件基本上是对解决方案文件夹中文件的快捷方式。但它们被视为项目中的实际文件(包括.CS或Visual Basic文件,它们将被编译为实际存在于项目中的文件)。
<强>赞成强>
<强> CONS 强>
AND - 从另一个答案中窃取整合信息,以下是如何将这些信息输出以进行调试(取自下面的评论,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>
答案 1 :(得分:12)
三种方法:
有关如何执行选项2的信息,请参阅 Compile your ASP.NET MVC Razor views into a separate DLL 。
有关选项3,请参阅 Creating and Publishing a Package 。
事实上,我认为这是关于如何编译Razor视图的原始文章: Precompile your MVC Razor views using RazorGenerator
答案 2 :(得分:0)
有更好的新选项(恕我直言)。
我会在ASP MVC Core中将优点组织为Feature
splices,这将节省大量时间,我会分两步推荐它。< / p>
首先,整理 /将其置于名为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的一篇不错的文章。