J'espère que d'essayer moi-même un peu plus tard, mais pour l'instant je vais partager mes réflexions actuelles:
dans les pages web, Razor fonctionne en enregistrant un BuildProvider avec le tuyau de génération ASP.NET pour .cshtml et .vbhtml.
WebPages, à son tour, enregistre les extensions .cshtml .vbhtml à son gestionnaire. Lorsqu'une page WebPages est demandée, System.Web.WebPages.WebPageHttpHandler transmet le chemin d'accès au tube de génération, où les extensions sont associées au fournisseur Razor enregistré, qui restitue la page et renvoie un objet WebPage, qui gère passe à IIS et est servi.
Vous verrez tout cela si vous utilisez un outil de réflexion. Les deux sont obtenus dans le PreApplicationStartCode.Start() de l'assembly correspondant.
rasoir accrochage de son fournisseur de construction:
public static void Start()
{
if (!_startWasCalled)
{
_startWasCalled = true;
BuildProvider.RegisterBuildProvider(".cshtml", typeof(RazorBuildProvider));
BuildProvider.RegisterBuildProvider(".vbhtml", typeof(RazorBuildProvider));
}
}
WebPages accrochage du WebPageHandler
public static void Start()
{
if (!_startWasCalled)
{
_startWasCalled = true;
WebPageHttpHandler.RegisterExtension("cshtml");
WebPageHttpHandler.RegisterExtension("vbhtml");
PageParser.EnableLongStringsAsResources = false;
DynamicModuleUtility.RegisterModule(typeof(WebPageHttpModule));
ScopeStorage.CurrentProvider = new AspNetRequestScopeStorageProvider();
}
}
Pour passer outre, nous aurions besoin de créer et enregistrer un BuildProvider séparé avec le tuyau d'ASP.NET pour rendre notre pages System.Web.WebPages fournit une méthode WebPageHttpHandler.RegisterExtension() qui, en théorie, vous pouvez raccorder un BuildProvider différent à celui qui obtiendra la requête WebPage au lieu de Razor.
Plusieurs blogs mentionnent la méthode RegisterExtension, mais il existe également un rapport de bogue open connect qui montre qu'il ne fonctionne pas à 100%. Il peut être plus approprié de tout simplement surcharger tout et d'accrocher notre fournisseur de construction à la pipe (n'utilisant pas la méthode). Web.config fournit une construction pour enregistrer buildProviders, donc je vais essayer cela.
<buildProviders>
<add extension=".cshtml" type="CustomStuff.CustomBuildProvider"/>
</buildProviders>
Le défi est que la plupart des moteurs de vue là-bas utiliser ViewEngines.Register(), un concept qui ne semble pas sur les pages Web d'avoir. Donc, nous devrons envelopper ces moteurs de vue dans un BuildProvider et/ou créer un BuildProvider qui peut invoquer avec succès IViewEngine
Encore une fois, juste partager ma pensée. Je vais essayer d'enregistrer Spark ou quelque chose plus tard si je trouve un peu de temps.
Quel est le nouveau moteur de pages Web? Ne pouvez-vous pas utiliser MVC et mélanger et faire correspondre? – mellamokb
L'équipe ASP.NET a déclaré (et vous avez confirmé avec Reflector) que les pages Web asp.net ne sont pas techniquement liées à Razor, tout comme MVC3.Cependant, je n'ai pas vu d'exemples sur la façon d'enregistrer quelque chose comme Spark avec des pages web .. et les blogs de l'équipe indiquent qu'ils vont le visiter plus tard. Je vous encourage donc à le faire, mais je ne peux malheureusement pas vous conseiller sur la façon de le réaliser. –
a ajouté une réponse à mon modèle de pensée actuel. Je vais essayer d'accrocher Spark plus tard si je peux trouver du temps. Problème intéressant que vous avez présenté –