2012-08-02 11 views
8

Sto creando un servizio Web RESTful utilizzando l'API Web ASP.NET MVC 4. Per l'accesso API, sto restituendo JSON, anche se una volta che tutto funziona correttamente, la negoziazione del contenuto dovrebbe funzionare per XML e JSON per impostazione predefinita.ASP.NET MVC 4/Web API - inserire Razor renderer per Accetta: text/html

Poiché sto lavorando per un servizio Web veramente incentrato sulle risorse, il mio URI punta alle risorse effettive. Vorrei approfittare di questo restituendo una rappresentazione HTML della risorsa se Accepts: text/html arriva nella richiesta (come lanciare il collegamento in un browser).

Mi piacerebbe essere in grado di approfittare di negoziazione dei contenuti MVC 4 Web API per inserire un renderer per il testo/HTML che utilizza i modelli rasoio. Ci sono esempi funzionanti di fare proprio questo?

Sì, questo è il collegamento di pagine MVC "regolari" e API Web. Fondamentalmente mi piacerebbe creare un renderer che usi un approccio basato su convenzioni per trovare e mostrare le visualizzazioni di Razor proprio come MVC "normale". Posso venire con la logica di ricerca della vista basata sulla convenzione. Sto semplicemente cercandoa) l'inserimento a livello globale il mio text/html renderer nel negotation contenuti, e b) manualmente utilizzando il motore di Razor per rendere il mio modello in HTML.

+0

Il reindirizzamento a un controller normale per Html può essere accettabile (o eseguire un'altra azione tramite HttpRequest e inviare i risultati al client)? –

+0

@KyleTrauberman, preferirei accedere alla negoziazione del contenuto. Almeno dalla mia comprensione limitata, architettonicamente questo sarebbe il più saggio in futuro. Immagino che l'API Web e il normale MVC si uniranno in futuro e posizionerei le mie puntate sull'infrastruttura dell'API Web, quindi costruire la struttura di negoziazione del contenuto sembra la strada giusta da percorrere. Il reindirizzamento a un altro controller potrebbe funzionare, ma la mia esperienza mi porta a credere che sarebbe innaturale e potrebbe causare problemi in futuro. Ma non sono contrario a capire come funzionerebbe :) – MikeJansen

risposta

3

Fredrik normen ha un post su questo argomento:

http://weblogs.asp.net/fredriknormen/archive/2012/06/28/using-razor-together-with-asp-net-web-api.aspx

In sostanza, è necessario creare un MediaTypeFormatter

using System; 
using System.Net.Http.Formatting; 

namespace WebApiRazor.Models 
{ 
    using System.IO; 
    using System.Net; 
    using System.Net.Http.Headers; 
    using System.Reflection; 
    using System.Threading.Tasks; 

    using RazorEngine; 

    public class RazorFormatter : MediaTypeFormatter 
    { 
     public RazorFormatter() 
     { 
      SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); 
      SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/xhtml+xml")); 
     } 

     //... 

     public override Task WriteToStreamAsync(
               Type type, 
               object value, 
               Stream stream, 
               HttpContentHeaders contentHeaders, 
               TransportContext transportContext) 
     { 
      var task = Task.Factory.StartNew(() => 
       { 
        var viewPath = // Get path to the view by the name of the type 

        var template = File.ReadAllText(viewPath); 

        Razor.Compile(template, type, type.Name); 
        var razor = Razor.Run(type.Name, value); 

        var buf = System.Text.Encoding.Default.GetBytes(razor); 

        stream.Write(buf, 0, buf.Length); 

        stream.Flush(); 
       }); 

      return task; 
     } 
    } 
} 

e quindi registrarlo in Global.asax:

GlobalConfiguration.Configuration.Formatters.Add(new RazorFormatter()); 

il codice sopra è copiato dal post del blog e non è il mio lavoro

+0

Perfetto, grazie! Molto più semplice di quanto mi aspettassi. – MikeJansen

0

Si potrebbe dare un'occhiata a WebApiContrib.Formatting.Razor. È molto simile alla risposta di Kyle, tuttavia è un progetto open source in piena regola con più funzioni, test unitari, ecc. Puoi anche fare get it on NuGet.

Dirò che ha sicuramente bisogno di più funzioni, ma sembra che l'abbiano progettato bene, quindi sarebbe molto facile contribuire ad esso.

Problemi correlati