2013-09-05 5 views
3

J'essaie d'utiliser ASP.NET WebPages pour donner un sens à un site existant qui utilise des fichiers statiques .html (environ 500 d'entre eux). Malheureusement, ma personne SEO exige que le site conserve son répertoire/nom de fichier existant, donc j'ai besoin d'utiliser .html.ASP.NET WebPages utilise l'extension html

Après avoir trouvé this example, j'ai essayé d'ajouter l'extension dans web.config sous compilation/buildProviders/ que:

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

et en ajoutant une Assemblée ainsi:

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

Cela ne rend pas la encore page. C'est simplement sortie comme source. J'ai aussi créé un Global.asax à la racine du projet et a ajouté ce sous Application_Start():

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

avait encore aucun effet. Malheureusement, je dessine un blanc sur Google.

+0

Voulez-vous dire que vous voulez mapper les demandes de * .html .cshtml fichiers, ou vous essayez d'ajouter du code Razor aux fichiers .html existants et voulez traité par ASP.NET? –

+0

Je veux que les fichiers '.html' soient automagiquement analysés par Razor. Par défaut, cette action est effectuée sur.fichiers cshtml. 90% de ce que je recherche est '@ Layout' et' @ RenderPage' (pour inclure d'autres pages). –

Répondre

4

Je suis tombé sur cette question en essayant de résoudre le même problème - bien que dans mon cas, par curiosité.

Voici ce que vous avez besoin dans votre fichier 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> 

Cela ne suffit pas à elle seule, bien! Nous devons enregistrer l'extension avec WebPageHttpHandler.
Normalement, vous seriez capable de faire des choses comme ça dans le fichier _AppStart - malheureusement, quand l'application démarre (c.-à-d. Quand _AppStart s'exécute), il itère sur les éléments dans les extensions supportées de WebPageHttpHandler, donc nous ne pouvons pas réellement nous enregistrer l'extension dans AppStart.
Ce que j'ai fait est que j'ai fait un nouvel assembly .dll avec l'attribut PreApplicationStartMethod, comme vu here, mais vous pouvez également le faire dans la méthode Global.asax du fichier Application_Start.

Enfin, nous devons également ajouter "html" en tant qu'extension au dictionnaire RazorCodeLanguage.Languages, afin que le moteur Razor puisse comprendre comment compiler le modèle.

Exemple de fichier 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> 
+0

+1 Cela fonctionne comme un charme :) Bien que j'ai pu m'enregistrer dans '_AppStart.chtml' sans problème. – EdSF

+0

Vous ne devriez pas pouvoir - la méthode 'ExecuteStartPage (HttpApplication)' dans 'ApplicationStartPage.cs' finit par appeler' ExecuteStartPageInternal' avec 'WebPageHttpHandler.GetRegisteredExtensions()' comme un IEnumerable. 'GetRegisteredExtensions' renvoie un wrapper en lecture seule pour le tableau _supportedExtensions, mais la modification de ce tableau modifie également le wrapper. 'ExecuteStartPageInternal' parcourt ce wrapper en lecture seule jusqu'à ce qu'il trouve un _AppStart avec une extension dans ce wrapper - mais comme il itère sur le wrapper, nous ne pouvons pas modifier le tableau sous-jacent dans _AppStart. – Santiclause

+0

J'ai bricolé avec ceci sur l'échafaudage par défaut (VS2013) pour 'ASP.net Web Site Razor 3' (pas application donc il n'y a même pas' global.asax') et AFAIK, que _Pages Web est. Plus spooky stuff - n'a pas besoin de la section 'handler',' buildProvider' était assez. Bricolé plus loin et ajouté plus de choses aléatoires comme ".edsf" et boom - code rasoir, sans extension, etc etc (juste pas d'intellisense). Je ne sais pas pourquoi je l'utiliserais vraiment, alors craie le bricoler :) – EdSF

0

Vous souhaitez utiliser le routage. Utilisez-vous des webforms ou MVC? Global.asax est un bon début. Ajouter le code complet ici:

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) 
     { 

     } 
    } 
} 

Il est évident que vous ne voulez pas ajouter manuellement 500 itinéraires, mais vous pouvez ajouter des filtres d'URL.

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

routage ASP.NET vous permet d'utiliser des URL qui ne sont pas à la carte à fichiers spécifiques dans un site Web.

+0

J'utilise en fait des pages Web ASP.NET pour que je puisse simplement créer des fichiers dans le paquet et les télécharger sur Azure. Je préfère ne pas impliquer MVC ou WebForms. Mais j'aimerais pouvoir réutiliser les modèles et le contenu plus tard si le projet évolue. –

+0

Toutes mes excuses, il y a peut-être une façon plus simple de le faire dans WebPages. La seule solution facile que je connaisse est d'utiliser MVC ... define {resource} .html dans votre table de routage et de spécifier un contrôleur, et ensuite le contrôleur ramasser une vue basée sur la {ressource} spécifié. Je crains pour votre santé mentale si vous devez manuellement rediriger 500 URL. PS. MVC utilise aussi Razor. – Zerkey

+0

J'en ai fait dans MVC et c'est là que j'ai appris Razor. En ce qui concerne les routes, c'est pourquoi je suis en train de tourner pour ce plan: je peux automatiser la création des fichiers sur le système de fichiers, il suffit d'utiliser .html dans TOUTES les URL au lieu de .cshtml. –