【问题标题】:ASP.NET WebPages use html extensionASP.NET 网页使用 html 扩展
【发布时间】:2013-09-05 02:22:46
【问题描述】:

我正在尝试使用ASP.NET WebPages 来了解使用静态 .html 文件(其中大约 500 个)的现有网站。不幸的是,我的 SEO 人员要求网站维护其现有的目录/文件名,所以我需要使用 .html。

找到this example后,我尝试在compilation/buildProviders/下的web.config中添加扩展为:

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

并添加一个程序集:

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

这仍然不会呈现页面。它只是作为源输出。我还在项目的根目录下创建了一个Global.asax 并将其添加到Application_Start() 下:

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

仍然没有效果。不幸的是,我在 Google 上画了一个空白。

【问题讨论】:

  • 您是说要将 *.html 请求映射到 .cshtml 文件,还是尝试将 Razor 代码添加到现有 .html 文件并希望它们由 ASP.NET 处理?跨度>
  • 我想 .html 文件自动被 Razor 解析。默认情况下,此操作对 .cshtml 文件执行。我正在寻找的 90% 是 @Layout@RenderPage(用于包括其他页面)。

标签: asp.net asp.net-webpages


【解决方案1】:

我在尝试解决同样的问题时遇到了这个问题 - 尽管在我的情况下,出于好奇。

这是您需要的 web.config 文件中的内容:

<system.web>
   <compilation>
      <buildProviders>
         <add extension=".html"
              type="System.Web.WebPages.Razor.RazorBuildProvider, System.Web.WebPages.Razor"/>
      </buildProviders>
   </compilation>
</system.web>
<system.webServer>
   <handlers>
      <add name="Html" verb="*" path="*.html"
           type="System.Web.Webpages, WebPageHttpHandler"/>
   </handlers>
</system.webServer>

不过,这还不够!我们需要用WebPageHttpHandler注册扩展。
通常,您可以在 _AppStart 文件中执行此类操作 - 不幸的是,当应用程序启动时(即当 _AppStart 执行时),它会遍历 WebPageHttpHandler 的 SupportedExtensions 中的项目,所以我们不能实际在 AppStart 中注册扩展。
我所做的是使用PreApplicationStartMethod 属性创建了一个新的.dll 程序集,如here 所示,但您也可以在Global.asax 文件的Application_Start 方法中执行此操作。

最后,我们还需要将“html”作为扩展名添加到RazorCodeLanguage.Languages 字典中,以便 Razor 引擎能够弄清楚如何编译模板。

示例 Global.asax 文件:

<%@ Application Language="C#" %>
<script runat="server">
   void Application_Start(object sender, EventArgs e) 
   {
      System.Web.WebPages.WebPageHttpHandler.RegisterExtension("html");
      var languages = System.Web.Razor.RazorCodeLanguage.Languages;
      languages.Add("html", languages["cshtml"]);
   }       
</script>

【讨论】:

  • +1 这就像一个魅力:) 虽然我能够毫无问题地在_AppStart.chtml 注册。
  • 你真的不应该这样做 - ApplicationStartPage.cs 中的 ExecuteStartPage(HttpApplication) 方法最终会调用 ExecuteStartPageInternalWebPageHttpHandler.GetRegisteredExtensions() 作为 IEnumerable。 GetRegisteredExtensions 返回 _supportedExtensions 数组的只读包装器,但修改该数组同样会修改包装器。 ExecuteStartPageInternal 迭代这个只读包装器,直到它在该包装器中找到一个带有扩展名的 _AppStart - 但是因为它正在迭代包装器,所以我们无法修改 _AppStart 内的底层数组。
  • 我在默认脚手架 (VS2013) 上为ASP.net Web Site Razor 3(不是应用程序,所以甚至没有global.asax)和 AFAIK 进行了修改,即 is WebPages。更多令人毛骨悚然的东西 - 不需要handler 部分,buildProvider 就足够了。进一步修补并添加了更多随机内容,例如“.edsf”和繁荣 - 剃须刀代码,无扩展名等(只是没有智能感知)。我不知道为什么我会真正使用它,所以把它归结为修补:)
【解决方案2】:

您想使用路由。您使用的是网络表单还是 MVC? Global.asax 是一个好的开始。在此处添加完整代码:

namespace Name
{
    public class Global : System.Web.HttpApplication
    {

        protected void Application_Start(object sender, EventArgs e)
        {
            RegisterRoutes(RouteTable.Routes);
        }

        protected void Session_Start(object sender, EventArgs e)
        {

        }

        protected void Application_BeginRequest(object sender, EventArgs e)
        {

        }

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {

        }

        protected void Application_Error(object sender, EventArgs e)
        {

        }

        protected void Session_End(object sender, EventArgs e)
        {

        }

        protected void RegisterRoutes(RouteCollection routes)
        {
            routes.MapPageRoute("Route1", "OldPage.html", "~/NewPage.aspx");

        }

        protected void Application_End(object sender, EventArgs e)
        {

        }
    }
}

显然您不想手动添加 500 条路由,但您可以添加 url 过滤器。

见:http://msdn.microsoft.com/en-us/library/cc668201.ASPX

ASP.NET 路由使您可以使用不必映射到的 URL 网站中的特定文件。

【讨论】:

  • 我实际上在使用 ASP.NET WebPages,这样我就可以在包中制作文件并上传到 Azure。我宁愿不涉及 MVC 或 WebForms。但如果项目发展,我希望以后能够重新使用模板和内容。
  • 抱歉,也许在网页中有更简单的方法。我知道的唯一简单的解决方案是使用 MVC ...在路由表中定义 {resource}.html 并指定一个控制器,然后让控制器根据指定的 {resource} 选择一个视图。如果您必须手动重新路由 500 个网址,我担心您的理智。 PS。 MVC 也使用 Razor。
  • 我在 MVC 中做了一些工作,这就是我了解 Razor 的地方。至于路线,这就是我制定这个计划的原因:我可以自动在文件系统上创建文件,只需要在所有 URL 中使用 .html 而不是 .cshtml。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
  • 2013-05-08
  • 2011-04-02
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多