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

时间:2013-11-18 16:10:07

标签: c# asp.net asp.net-mvc

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

我也在使用IISExpress来测试网站,因此无论解决方案是什么,都应与此兼容。

3 个答案:

答案 0 :(得分:2)

我已经在几个简短的步骤中提出了解决问题的最简单方法。最耗时的部分是制作下面的powershell脚本的副本,但你只需要永远这样做一次。

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

Link it!

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

第2部分
我设法通过编写一个快速的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
   }
}

第3部分
一旦你有了可用的脚本,你可以在你认为合适的情况下包含一个事后构建事件:

build

在这种情况下,我使用'verbose'开关,以便从输出窗口的脚本中获取复制消息3。我还设置了我的powershell配置文件来加载脚本,以便我可以直接调用Cmdlet,尽管你可以按照自己喜欢的方式进行操作。好消息是,一旦设置完毕,您就可以粘贴构建事件,并且可以轻松地在MVC项目之间共享资源。
由于链接项的物理副本是针对每个构建的,因此您将不再获得那些讨厌的404并且找不到文件。

答案 1 :(得分:1)

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

enter image description here

这样可以将同一文件添加到多个项目而不创建它的副本。符号链接,如果你愿意。

答案 2 :(得分:-1)

如果您使用SVN(不确定如何在其他版本控制系统中完成 - 但我相信它类似) - 您可以使用“svn:externals”属性将“原始”项目中的文件夹映射到其他项目中。不确定MVC将如何采取这种做法 - 您可以将布局文件放入与“共享”文件夹不同的位置吗?我认为你应该能够 - 只需要在你的视图中正确指定路径。