我正在构建的几个网站在页面中显示相同或相似的数据。为了减少代码重复,我所做的是创建了第三个项目/网站,并认为我将其用作共享HTML,java脚本,CSS,图像等的位置。
我可以使用相对路径从共享项目中包含JavaScript,CSS和图像。但是我无法呈现HTML的部分页面。当试图访问试图使用以下代码加载部分页面的两个网站时:
@RenderPage("/SharedArtifacts/Views/MySharedViewscshtml")
我收到以下回复:
The virtual path '/SharedArtifacts/Views/MySharedViewscshtml' maps to another application, which is not allowed.
现在我用谷歌搜索并尝试使用~
前缀来指定解决问题的路径的根,但无济于事......仍然是同样的错误。
有关如何解决此问题的任何想法?
答案 0 :(得分:5)
我们一直这样做。简单(非编程)方式是在IIS中创建虚拟文件夹,映射到所有配套站点共有的共享文件夹。我们通常对错误结果页面和其他通用内容执行此操作。
/Views/SharedVirtual/somefile.ascx
路径/Views/SharedVirtual
通过IIS的虚拟文件夹进行映射。然后在控制器中我们可以做return View("/Views/SharedVirtual/somefile.ascx",somemodel);
。它也适用于RenderPartial。
在处理项目时,我使用mklink在项目文件夹中创建一个映射到共享公共文件夹的联结点。这样VS认为文件夹是本地文件夹,并且可以在本地运行项目进行调试。
我们通常不使用Razor,但这个概念应该是一样的,因为它不是做共享映射的VS,而是操作系统和IIS。
有一点需要注意的是,如果您编辑视图,它们将在所有项目中进行更改,因此您必须小心编辑,以确保它们在引用它们的所有项目中使用时是兼容的。
答案 1 :(得分:3)
您想要呈现的视图位于Web应用程序根目录之外。至少出于安全原因,这是不允许的。
然而,您可以通过选择“嵌入资源”构建操作而不是默认构建操作来将veiws(.cshtml)嵌入资源。然后,使用NuGet包管理器安装并使用能够呈现已嵌入的视图的虚拟路径提供程序,如here,here或here。
答案 2 :(得分:0)
ASP.NET MVC将在视图的同一程序集中查找。将View或HTML放在不同的程序集中对于框架来说将是尴尬的。在内部,我不认为框架支持在程序集范围之外定位View / HTML。您可能需要编写一些自定义代码或扩展框架,它的开源。
答案 3 :(得分:0)
当我需要在多个项目之间共享代码时,我通常使用visual studio的open as link功能。这允许您为多个项目提供一个文件。
https://msdn.microsoft.com/en-us/library/windows/apps/jj714082(v=vs.105).aspx