2013-04-19 11 views
6

Sto utilizzando MVC3, .NET4, C#.Come ottenere una risposta "stream" da un'azione in MVC3/Razor?

Ho bisogno di creare un XHTML usando una vista del rasoio. Lo faccio tramite un'azione.

public ActionResult RenderDoc(int ReportId) 
    { 
     //A new document is created. 

     return View(); 
    } 

Ho quindi bisogno di prendere l'output da questo e convertirlo in un documento di Word. Sto usando un componente di terze parti per fare questo e si aspetta un "flusso" o un "file" per la sorgente XHTML che viene letta in per la conversione in un DOC, come il seguente:

document.Open(MyXhtmlStream,FormatType.Html,XHTMLValidationType.Transitional); 

La mia domanda :

Quale sarebbe un buon modo per chiamare l'azione "RenderDoc" e ottenere il risultato come flusso da inserire in "MyXhtmlStream".

Molte grazie.

EDIT: Ho avuto un'altra idea !!!

1) Visualizzare la vista all'interno dell'azione per creare una stringa (XHTMLString). Ho visto un metodo per farlo su SO.

2) Creare un MemoryStream e inserire questa stringa in esso.

Stream MyStream = New MemoryStream("XHTMLString and encoding method"); 

EDIT2: Sulla base di risposta di Darin

ho bisogno di clasyify un po 'più, e spero di fare questo via modificando il codice di Darin per il mio scopo.

public class XmlDocumentResult : ActionResult 
{ 
    private readonly string strXhtmlDocument; 
    public XmlDocumentResult(string strXhtmlDocument) 
    { 
    this.strXhtmlDocument = strXhtmlDocument; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
    WordDocument myWordDocument = new WordDocument(); 
    var response = context.HttpContext.Response; 
    response.ContentType = "text/xml"; 
    myWordDocument.Open(response.OutputStream, FormatType.Html, XHTMLValidationType.Transitional); 
    } 
} 

Quanto sopra è più vicino a quello che mi serve. Nota il tipo WordDocument di terze parti. Quindi non v'è ancora la questione di come ottengo il "strXhtmlDocument" in "Response.OutputStream

+0

non puoi davvero ottenerlo dall'azione. questo è troppo presto nella pipeline. –

+0

Quando dici // viene creato un nuovo documento hai uno stream in quel punto?O stai recuperando questo documento da qualche parte? – Robert

+0

Non ho flusso. Fondamentalmente ho appena usato una Razor View, tramite l'azione "RenderDoc", per creare l'XHTML. Quindi voglio convertire questo in un DOC. Logicamente speravo di incorporare semplicemente una chiamata a questa azione nel metodo aperto, ma non è così semplice. – SamJolly

risposta

5

vorrei solo scrivere un ActionResult personalizzato per gestire che:?

public class XmlDocumentResult : ActionResult 
{ 
    private readonly Document document; 
    public XmlDocumentResult(Document document) 
    { 
     this.document = document; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     var response = context.HttpContext.Response; 
     response.ContentType = "text/xml"; 
     document.Open(response.OutputStream, FormatType.Html, XHTMLValidationType.Transitional); 
    } 
} 

Si potrebbe, naturalmente, regolare la risposta . Content-Type se necessario, e anche aggiungere un'intestazione Content-Disposition se si vuole

e poi semplicemente avere il mio ritorno azione di controllo questo risultato azione personalizzata:

public ActionResult RenderDoc(int reportId) 
{ 
    Document document = repository.GetDocument(reportId); 
    return new XmlDocumentResult(document); 
} 

Ora l'azione del controllore non ha più bisogno di gestire il codice idraulico. L'azione di controllo fa quello che si suppone una tipica azione di controllo da fare:

  1. Query del Modello
  2. Passo questo modello a un ActionResult

Nel tuo caso il modello è questa classe Document o qualunque cosa è chiamato.

+0

Ciao Darin, grazie per questo. Molto completo Un punto che vorrei aggiungere a questo è che sto passando il ReportId alla vista e con questo sta riunendo tutti gli ingredienti del report. Quindi Return View() restituisce letteralmente il mio XHTML renderizzato. Non riesco a vedere nel tuo esempio in cui il bit Razor entra. – SamJolly

+0

Sì, ho bisogno di sostituire "Document document = repository.GetDocument (reportId);" con una chiamata ad un'altra Azione che chiama Razor View che crea il mio XHTML, o crea una stringa in linea tramite una chiamata diretta al Razor Engine .... che ho visto per i solutios su SO. – SamJolly

+0

Ho aggiunto un Modifica che si spera chiarisca. Ho ancora il problema di come ottengo "strXhtmlDocument" in "Response.OutputStream, a meno che non mi sfugga qualcosa? Apprezzo moltissimo l'ottimo aiuto. Grazie. – SamJolly

Problemi correlati