2017-03-24 1 views
6

Mit Asp.Net war es einfach, den von der Razor View Engine generierten Code zu sehen: Fügen Sie einen Kompilierungsfehler hinzu und die Fehlerseite gibt Zugriff auf die Quelle der Razor Page.Wie kann ich den für eine Razor Page generierten Code sehen, wenn ich Asp.Net Core verwende?

Dies änderte sich mit Asp.Net Core, die ich irgendwo lesen erstellt den Code im Speicher und ermöglicht keinen einfachen Zugriff auf diesen Code.

Frage: Jemand kennt einen Trick, wie man mit Asp.Net Core auf generierten Razor Quellcode zugreifen kann?

Antwort

6

Fügen Sie die folgende Klasse Ihres ASP.NET-Core MVC-Projekt:

using Microsoft.AspNetCore.Mvc.ApplicationParts; 
using Microsoft.AspNetCore.Mvc.Razor; 
using Microsoft.AspNetCore.Mvc.Razor.Compilation; 
using Microsoft.AspNetCore.Mvc.Razor.Internal; 
using Microsoft.Extensions.Logging; 
using Microsoft.Extensions.Options; 

public class CustomCompilationService : DefaultRoslynCompilationService, ICompilationService 
{ 
    public CustomCompilationService(ApplicationPartManager partManager, 
     IOptions<RazorViewEngineOptions> optionsAccessor, 
     IRazorViewEngineFileProviderAccessor fileProviderAccessor, 
     ILoggerFactory loggerFactory) 
     : base(partManager, optionsAccessor, fileProviderAccessor, loggerFactory) 
    { 
    } 

    CompilationResult ICompilationService.Compile(RelativeFileInfo fileInfo, 
     string compilationContent) 
    { 
     return base.Compile(fileInfo, compilationContent); 
    } 
} 

Aufschalten des ICompilationService von MVC mit der obigen Klasse hinzugefügt;

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc(); 
    services.AddSingleton<ICompilationService, CustomCompilationService>(); 
} 

einen Haltepunkt auf die Methode Compile Set CustomCompilationService und Blick compilationContent.

enter image description here

Hinweise

anzeigen Lookups sind Groß- und Kleinschreibung. Wenn Ihr Controller-Routing eine Ansicht Index genannt sucht (Index.cshtml), aber Sie haben Ihre Ansicht Datei index (index.cshtml) genannt, erhalten Sie eine Ausnahme erhalten:

InvalidOperationException: Die Ansicht ‚Index‘ wurde nicht gefunden.

+0

perfekte Antwort. vielen Dank. – citykid

+0

Was ist mit ASP.NET Core 2.0? – derigel

+0

@SinglePackAbs yep, es gibt weder DefaultRoslynCompilationService noch ICompilationService. – derigel

4

Künstliche Dummheit lieferte die richtige Antwort für ASP.NET Core 1.x. Für die Version 2.0 des Rahmens kann man stattdessen eine benutzerdefinierte Rasierer Template-Engine verwenden:

using Microsoft.AspNetCore.Mvc.Razor.Extensions; 
using Microsoft.AspNetCore.Razor.Language; 

public class CustomMvcRazorTemplateEngine : MvcRazorTemplateEngine 
{ 
    public CustomMvcRazorTemplateEngine(RazorEngine engine, RazorProject project) : base(engine, project) 
    { } 

    public override RazorCSharpDocument GenerateCode(RazorCodeDocument codeDocument) 
    { 
    RazorCSharpDocument razorCSharpDocument = base.GenerateCode(codeDocument); 
    // Set breakpoint here for inspecting the generated C# code in razorCSharpDocument.GeneratedCode 
    // The razor code can be inspected in the Autos or Locals window in codeDocument.Source._innerSourceDocument._content 
    return razorCSharpDocument; 
    } 
} 

dann die RazorTemplateEngine des Rahmens außer Kraft setzen:

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc(); 
    services.AddSingleton<RazorTemplateEngine, CustomMvcRazorTemplateEngine>(); 
} 
3

In einer einfachen Konsole-Anwendung:

using Microsoft.AspNetCore.Razor.Language; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var sourceDocument = RazorSourceDocument.Create("Hello world", ""); 
     var codeDocument = RazorCodeDocument.Create(sourceDocument); 

     var engine = RazorEngine.Create(); 
     engine.Process(codeDocument); 

     var csharpDocument = codeDocument.GetCSharpDocument(); 
     var csharp = csharpDocument.GeneratedCode; 
     Console.WriteLine(csharp); 
    } 
} 

Ausgabe ist:

#pragma checksum "" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "7b502c3a1f48c8609ae212cdfb639dee39673f5e" 
// <auto-generated/> 
#pragma warning disable 1591 
namespace Razor 
{ 
    #line hidden 
    public class Template 
    { 
     #pragma warning disable 1998 
     public async override global::System.Threading.Tasks.Task ExecuteAsync() 
     { 
      WriteLiteral("Hello world"); 
     } 
     #pragma warning restore 1998 
    } 
} 
#pragma warning restore 1591 
Verwandte Themen