【问题标题】:Can I serve .html files using Razor as if they were .cshtml files without changing the extension of all my pages?我可以使用 Razor 提供 .html 文件,就好像它们是 .cshtml 文件一样,而不更改我所有页面的扩展名?
【发布时间】:2011-07-03 21:59:15
【问题描述】:

我管理一个大型 asp.net 网站,该网站之前已从静态 html 网站转换为 asp.net。

出于多种原因(主要是 SEO),我们决定在最初转换网站时不将所有文件重命名为 .aspx。这很容易做到,只需将 buildProvider 和 httpHandler 添加到 web.config。

<buildProviders>
  <add extension=".html" type="System.Web.Compilation.PageBuildProvider"/>
</buildProviders>

<httpHandlers>
  <add path="*.html" verb="*" type="System.Web.UI.PageHandlerFactory"/>
</httpHandlers>

现在我正在升级站点以使用带有 Razor cshtml 文件的 Asp.net WebPages。如果需要,我可以重命名所有文件,并使用 url 重写使 url 保持不变,但是如果我可以配置 web.config 告诉它解析 .html 文件,就好像它们是 .cshtml 一样容易得多.

我已经搜索了很多,但找不到任何与 PageHandlerFactory 等效的剃须刀页面。看起来它只是 .net 4.0 ISAPI 处理程序中的一种内部机制。

该站点目前在 Windows 2003 服务器和 IIS 6 上运行。我们将在不久的将来升级到 2008/IIS 7.5,但我不想等到那个。

有没有办法让 .html 文件像 .cshtml 文件一样被 razor 解析?

【问题讨论】:

    标签: asp.net iis-6 razor


    【解决方案1】:

    感谢 SLaks 为我指明了正确的方向,但仍然需要花费几个小时在 MVC 源代码中挖掘才能找出解决方案。

    1 - 需要将 RazorBuildProvider 放在 web.config 中

    <buildProviders>
        <add extension=".html" type="System.Web.WebPages.Razor.RazorBuildProvider"/>
    </buildProviders>
    

    如果 System.Web.WebPages.Razor 不存在,则将其添加到程序集中。

    <assemblies>
         [...]
         <add assembly="System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    </assemblies>
    

    2 - 在 global.asax Application_Start() 方法中添加 2 行

    // Requires reference to System.Web.WebPages.Razor
    System.Web.Razor.RazorCodeLanguage.Languages.Add(
        "html", new CSharpRazorCodeLanguage());
    
    WebPageHttpHandler.RegisterExtension("html");
    

    【讨论】:

    • 我返回的是一个 css 文件而不是 cshtml 文件。这种方法对 MVC3 有效吗?如果是,哪个 web.config 位于根文件夹或 Views 文件夹下?以及在 web.config 中的确切位置。我试图这样做,但它没有将扩展名添加到语言列表中。有什么想法吗?
    • @Idrees:是的。根 Web.config。列出哪些语言?
    • @SLaks 团队领导放弃了这个想法。太酷了:D
    • 然后你需要覆盖默认的razor视图引擎并将.html添加到ViewLocationFormats和PartialViewLocationFormats
    • @KevinLewis 我应该将&lt;buildProvider&gt; 配置放在web.config 文件的哪个位置?我正在尝试做同样的事情,使用剃刀语法从 csmd 生成 md 文件,我希望 IntelliSense 可用。这是要走的路吗?
    【解决方案2】:

    Call WebPageHttpHandler.RegisterExtension.

    您可能还需要注册一个自定义 WebPageRazorHostFactory 来告诉 Razor 引擎如何处理该文件;我不确定。

    【讨论】:

      【解决方案3】:

      因为这实际上已解决用于 VS2012 / .net 4.5。 在 C#5 项目中使用上面的示例时,我没有运气:(

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-16
        • 2010-10-04
        • 2013-12-18
        • 2018-10-19
        • 2021-05-19
        • 2011-01-16
        • 2017-12-21
        • 1970-01-01
        相关资源
        最近更新 更多