2015-04-07 4 views
6

Stiamo lavorando al progetto ASP.NET MVC 6 ed è necessario eseguire il rendering di visualizzazioni Razor diverse da quella del file system (lo storage Azure Blob in particolare ma non è importante). In precedenza (in MVC 5) era possibile creare e registrare il VirtualPathProvider personalizzato che può richiedere il contenuto della visualizzazione da DB o DLL di risorse (ad esempio).Visualizzazione rendering da DB in MVC 6

Sembra che l'approccio sia stato modificato in MVC 6. Qualcuno sa dove cercare?

UPD: Ecco un esempio di codice che sto cercando:

public IActionResult Index() 
    { 

     ViewBag.Test = "Hello world!!!"; 
     string htmlContent = "<html><head><title>Test page</title><body>@ViewBag.Test</body></html>"; 

     return GetViewFromString(htmlContent); 
    } 

La domanda è: come implementare che GetViewFromString funzione?

+0

Hai finito per trovare una soluzione a questo? Sto cercando la stessa cosa – fenix2222

risposta

2

è necessario configurare un ViewLocationExpander:

services.SetupOptions<RazorViewEngineOptions>(options => 
{ 
    var expander = new LanguageViewLocationExpander(
     context => context.HttpContext.Request.Query["language"]); 
    options.ViewLocationExpanders.Insert(0, expander); 
}); 

e qui è l'implementazione per il LanguageViewLocationExpander: https://github.com/aspnet/Mvc/blob/ad8ab4b8fdb27494f5dece6f1186acea03f9dd52/test/WebSites/RazorWebSite/Services/LanguageViewLocationExpander.cs

Basando il tuo AzureBlobLocationExpander su che si dovrebbe mettere in strada giusta.

+0

Non è proprio quello che stavo cercando (o almeno lo penso). ViewLocationExpander consente di specificare alcune cartelle diverse da quelle predefinite in cui Razor Engine cercherà i file di visualizzazione. Mentre ho bisogno di qualcosa come il codice di cui sopra (vedi la domanda aggiornata). – Sergiy

+0

Ora capisco. Mi dispiace ma non sono sicuro di come farlo accadere. Stavo guardando il codice sorgente e non sembra facile. Una cosa che posso pensare è creare un file temporaneo .cshtml ma questo è un trucco e non sarà molto performante. –

-1

Appena pubblicato un esempio di archivio .cshtml in Archiviazione BLOB di Azure su GitHub.

Vedi anche la mia risposta a another question su questo

In sostanza è necessario creare un'implementazione di IFileProvider. Questo può quindi essere registrato in Startup.cs configurando RazorViewEngineOptions

services.Configure<RazorViewEngineOptions>(options => 
{ 
    options.FileProvider = new AzureFileProvider(Configuration); 
}); 
+0

Grazie per il feedback @Alexei, ho messo alcuni dettagli anche in questo momento –