C# 在MVC项目之间共享视图、图像和其他内容的好方法?

C# 在MVC项目之间共享视图、图像和其他内容的好方法?,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我有两个MVC4网站,它们使用相同的布局、图像、css文件等。我试图找到一种方法在它们之间共享这些类型的资源,这样当我对文件进行更改时,两个项目都可以得到更新,而无需我做任何额外的事情。到目前为止,我所能做的只是在项目之间进行复制粘贴,添加链接项不起作用,因为没有制作文件的物理副本,但从长远来看,这显然不起作用。有没有一个简单的方法可以做到这一点,还是我运气不好 我还使用IISExpress测试站点,因此无论解决方案是什么,都应该与此兼容。是-使用添加作为添加现有项命令的链接选项: 这样,可以将

我有两个MVC4网站,它们使用相同的布局、图像、css文件等。我试图找到一种方法在它们之间共享这些类型的资源,这样当我对文件进行更改时,两个项目都可以得到更新,而无需我做任何额外的事情。到目前为止,我所能做的只是在项目之间进行复制粘贴,添加链接项不起作用,因为没有制作文件的物理副本,但从长远来看,这显然不起作用。有没有一个简单的方法可以做到这一点,还是我运气不好


我还使用IISExpress测试站点,因此无论解决方案是什么,都应该与此兼容。

是-使用添加作为添加现有项命令的链接选项:


这样,可以将同一文件添加到多个项目中,而无需创建副本。符号链接,如果您愿意。

如果您使用SVN,则不确定这在其他版本控制系统中是如何实现的-但我相信它是类似的-您可以使用SVN:externals属性将文件夹从原始项目映射到其他项目中。不确定MVC将如何处理这个问题-您可以将布局文件放入不同于共享文件夹的文件夹中吗?我认为您应该能够-只需要在视图中正确指定路径。

我通过几个简单的步骤就找到了解决问题的最简单方法。最耗时的部分是复制下面的powershell脚本,但您只需复制一次即可,永远如此

第一部分 第一步包括链接要在项目中共享的文件。这些可以是图像、css、视图、javascript等。使用“添加现有项”中的对话框,如下所示:

链接文件立即适用于代码文件,但不适用于内容。这是因为没有创建文件的物理副本,因此在本例中,服务器IISExpress将无法找到它,从而导致404或崩溃

第二部分 我通过编写一个快速powershell脚本来解决这个问题,该脚本将在给定项目中创建链接项的物理副本。这是我现在使用的脚本,虽然它适用于上面提到的所有文件类型,但它可能不会涵盖将来的所有内容,但我认为扩展它将相当容易

function Copy-LinkedFiles
{
<#
   .DESCRIPTION
   Creates a physical copy of linked files in your visual studio projects.
   This is very handy for ASP projects that make sharing resources between projects in a solution a real
   pain in the ass.
#>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [string]
        $ProjectFile
    )

   # Find all of the linked Content items in the projects.
   $ns = @{p = "http://schemas.microsoft.com/developer/msbuild/2003"}

   $contentFiles = select-xml -Path $ProjectFile -Namespace $ns -XPath "/p:Project/p:ItemGroup/p:Content"

   $withLink = $contentFiles | Select-Object -ExpandProperty Node | Where-Object -Property Link

   $projDir = [System.IO.Path]::GetDirectoryName($ProjectFile)
   $withLink | ForEach-Object -Process {

        $srcPath = [System.IO.Path]::GetFullPath($projDir + "\" + $_.Include)
        $destPath = [System.IO.Path]::GetFullPath($projDir + "\" + $_.Link)

        Write-Verbose "Copying file from $srcPath to $destPath"
        Copy-Item -path $srcPath -Destination $destPath -Force
   }
}
第三部分 一旦脚本可用,就可以按照您认为合适的方式包括编译前-编译后事件,如下所示:

在本例中,我使用“verbose”开关,以便在输出窗口中从脚本中获取复制消息。我还设置了powershell配置文件以加载脚本,这样我就可以直接调用Cmdlet,尽管您可以按自己喜欢的方式执行。好消息是,一旦设置好,您就可以粘贴构建事件,并且可以在MVC项目之间轻松共享资源。
由于链接项的物理副本是在每个构建中生成的,因此您将不会再收到那些令人讨厌的404和file not found消息。

我在问题中明确表示,这不起作用。以这种方式添加时,应用程序找不到项目。到底是什么不起作用?。。你会犯什么错误?我在我的项目中使用它,我没有任何问题。在以下路径中找不到[layout,etc.]页[path],您必须发布该路径才能将布局文件复制到正确的文件夹中。您可以将发布到某个本地文件夹的任务添加到生成后脚本中,这样您就可以方便地进行调试。我已经对您的答案进行了扩展,提供了一个实际可行的解决方案。很抱歉您有这种感觉。我无意冒犯你。如果这让你感觉更好,请否决我的问题。不需要点名,我只是想找到我问题的答案/具有建设性。我已经做了一次搜索,但我还没有找到答案,我想为什么这里还没有列出答案。呵呵-我已经提供了两个解决方案-链接+构建后发布,svn:externals-而你对这两个方案都投了反对票。。。祝你好运,巴德