【问题标题】:Sharing Razor views across projects跨项目共享 Razor 视图
【发布时间】:2013-12-17 10:23:49
【问题描述】:

我想在多个 ASP.NET MVC 项目之间共享布局(页眉、导航和页脚 Razor 视图)。我该怎么做?

我可以创建一个自定义的NuGet 包来包装常见的 Razor 文件、图像和 CSS 吗?

【问题讨论】:

    标签: asp.net-mvc razor


    【解决方案1】:

    我现在通过 Google 不止一次遇到过这个问题,尽管我会提出另一个解决方案(IMO,它比使用预编译器和包更安全、更易于管理)。

    事实上,我已经无耻地逐字抄袭了 Erik Phillips 的回答,所以请感谢他。

    他说了什么...(他特别针对 javascript 文件这样说,但这与任何其他类型一样有效)source answer

    以下是我的建议:

    右键单击解决方案并创建一个名为Common Javascript Files(或任何您喜欢的名称)的新解决方案文件夹

    右键单击解决方案,单击在 Windows 资源管理器中打开文件夹, 或手动导航到其他版本的 Visual Studio :(

    在解决方案目录中,创建一个与解决方案文件夹同名的目录(解决方案文件夹通常与源代码级别的目录不匹配,但这是为了保持理智)。

    在这个新目录中,添加需要在解决方案之间共享的文件。

    在 Visual Studio 中,单击解决方案文件夹并选择添加 - 现有项

    在文件选择对话框中,导航到之前创建的目录,选择添加到目录中的文件并单击添加

    在每个需要共享文件的项目中,右键单击项目(或项目内的目录),然后单击添加 - 现有项

    导航到共享目录,选择文件并单击下拉箭头,然后单击添加为链接

    现在项目中的文件基本上是解决方案文件夹中文件的快捷方式。但它们被视为项目中的实际文件(这包括 .CS 或 Visual Basic 文件,它们将被编译为项目中实际存在的文件)。

    优点

    • 设计时真正跨项目共享文件
    • 只能添加每个项目需要的文件,不是全有或全无
    • 不需要在 IIS 中进行任何配置(虚拟目录等)
    • 如果解决方案在 TFS 源代码控制中,您可以将目录添加到 TFS 源代码中,共享文件将受到源代码控制。
    • 通过在项目中选择文件来编辑文件,将编辑实际文件。
    • 删除链接文件不会删除该文件。
    • 这不仅限于 JS 文件,链接文件可以是您可能需要的任何文件(图像、Css、Xml、CS、CSHTML 等)

    缺点

    • 每个部署都有自己的文件。
    • 在了解解决方案文件夹不是解决方案目录中存在的目录时,有一个小的学习曲线。

    并且 - 从另一个答案中窃取信息以整合信息,这是您如何将这些结果输出以进行调试(取自已抓取答案下方的评论,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>
    

    【讨论】:

    • @ErikPhilips - 仅供参考,我已将您的答案从另一篇文章复制到此处...不太确定如何处理,因此:meta.stackoverflow.com/questions/323545/…
    • 在某人未参与的帖子上对其进行 ping 操作是行不通的。如果您希望 ErikPhilips 看到此评论,您必须向他发送原始答案
    • 只是想评论一下这种方法的一个缺点是,如果你编辑一个链接文件,你必须重新启动项目来测试它——所以它可能会很烦人。编辑 CSS 文件以尝试通常会在刷新浏览器时立即显示的内容。
    • 当我将 cshtml 文件添加为链接时,没有智能感知,VS 将其视为所有 Razor 都“损坏”了任何代码下的红线。我还没有弄清楚如何解决stackoverflow.com/questions/41511770/…
    • @jleach 等 - 有没有人尝试过这种方法用于 MVC Razor 视图?问题特别是关于 Razor 的观点,因此最好列出针对这些观点使用这种方法的利弊。
    【解决方案2】:

    三种方法:

    1. 使用您的版本控制系统共享 Razor 视图源代码
    2. 将视图编译成单独的 DLL 文件以进行二进制共享。
    3. 创建 NuGet 包

    请参阅 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

    【讨论】:

    • 我可以在这里使用 Nuget 吗?我正在考虑创建一个自定义 nuget 包。但不确定这是否是正确的选择。
    • 参考上面第二篇文章,是的,在NuGet上,目前叫RazorGenerator.Mvc。
    • @Mark:除非您在不同解决方案中的项目之间共享,否则我不会使用 Nuget 包。如果您的项目都在同一个解决方案中,只需添加一个简单的参考。此外,CSS、图像等最好放置在每个项目都可以从中提取的静态域中,如果它们是真正共享的并且根本不是每个项目定制的。
    • 另一种方法是通过 VS 构建事件(项目 -> 属性 -> 构建事件) - 添加一些脚本以简单地将 View 源文件复制到您的 MVC 项目 View 目录。
    • RazorGenerator 已移至 github 供任何人搜索。
    【解决方案3】:

    有更好的新选项(恕我直言)。 我会利用 优势 在 ASP MVC Core 中将其组织为 Feature splices,这样可以节省大量时间,我会分两步推荐它。

    1. 首先,组织/放置一个名为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);
          }
      }
      
    2. 第二,嵌入 Shared projectPortable Libraries。我附上了链接 R. Williams 和 MSDN 如何做到这一点。

    总而言之,由于您已经在公共区域中拥有它,因此将其视为一项功能并将其嵌入到 portable lib or a Shared Project 中。 R. Williams 的一篇不错的文章。

    【讨论】:

    • 通过共享项目共享视图的缺点似乎也是 ASP.NET MVC 5(旧堆栈)不喜欢它。 Razor 吐出一个错误,即共享项目的相对路径无效(即使它在错误消息中显示了绝对路径)。我已经发现了如何解决这个问题。任何人有任何想法,链接?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多