2013-04-19 14 views
6

Używam MVC3, .NET4, C#.Jak uzyskać odpowiedź "strumień" z akcji w MVC3/Razor?

Potrzebuję stworzyć trochę XHTML przy użyciu widoku maszynki. Robię to poprzez działanie.

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

     return View(); 
    } 

Następnie należy pobrać dane wyjściowe z tego i przekonwertować go do dokumentu Word. Używam składnik 3rd party to zrobić i że spodziewa się „strumień” lub „plik” dla źródła XHTML, który jest odczytywany przez konwersję do DOC, jak następuje:

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

moje pytanie :

Jaki byłby dobry sposób wywoływania akcji "RenderDoc" i uzyskania wyniku jako strumienia do "MyXhtmlStream".

Wielkie dzięki.

EDYCJA: Mam inny pomysł !!!

1) Renderuj widok w ramach akcji, aby utworzyć ciąg (XHTMLString). Widziałem metodę to zrobić na SO.

2) Utwórz obiekt MemoryStream i umieść w nim ciąg znaków.

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

EDIT2: Na podstawie Darin za odpowiedź

muszę clasyify trochę dalej i mam nadzieję to zrobić poprzez szczypanie kodu Darin dla mojego celu.

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); 
    } 
} 

Powyższe jest bliższe temu, czego potrzebuję. Zwróć uwagę na typ WordDocument firmy zewnętrznej. Więc jest jeszcze kwestia tego, jak otrzymuję „strXhtmlDocument” do „Response.OutputStream

+0

Naprawdę nie można uzyskać tego z działania. to zbyt wcześnie w przygotowaniu. –

+0

Kiedy mówisz, że // Tworzony jest nowy dokument, czy masz strumień w tym momencie?A może wyszukujesz gdzieś ten dokument? – Robert

+0

Nie mam strumienia. Zasadniczo użyłem widoku Razor View, poprzez akcję "RenderDoc", aby utworzyć XHTML. Następnie chcę przekonwertować to na DOC. Logicznie rzecz biorąc, miałem nadzieję, że po prostu włączę wezwanie do tej akcji do metody otwartej, ale nie jest to takie proste. – SamJolly

Odpowiedz

5

Chciałbym tylko napisać niestandardowy ActionResult obsłużyć, że:?

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); 
    } 
} 

Można by oczywiście regulować odpowiedź . Content-Type jeśli to konieczne, a także dołączyć Content-Disposition nagłówek, jeśli chcesz

a następnie po prostu mieć mój powrót kontroler ten wynik działania niestandardowe działanie:

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

Teraz działanie kontrolera nie musi już obsługiwać kodu hydraulicznego. Akcja kontroler robi to, co typowe działania kontroler ma robić:

  1. Zapytanie Model
  2. Przełęcz tego modelu do ActionResult

CASE model jest ten Document klasa czy cokolwiek to jest nazywany.

+0

Cześć Darin, dzięki za to. Bardzo kompleksowy. Jedną z rzeczy, które chciałbym dodać, jest to, że przekazuję ReportId do Widoku, a wraz z nim gromadzi wszystkie składniki raportu. Tak więc Return View() dosłownie zwraca mój renderowany XHTML. Nie widzę w twoim przykładzie miejsca, w którym pojawia się bit Razor. – SamJolly

+0

Tak, muszę zastąpić "Document document = repository.GetDocument (reportId);" z wywołaniem innej akcji, która wywołuje widok maszynki Razor, który tworzy mój XHTML, lub tworzy ciąg inline przez bezpośrednie połączenie z maszyną Razor ..., na której widziałem solutje na SO. – SamJolly

+0

Dodałem edycję, która, mam nadzieję, wyjaśni. Nadal mam problem, w jaki sposób uzyskać "strXhtmlDocument" w "Response.OutputStream, chyba że czegoś brakuje? Bardzo doceniam wielką pomoc. – SamJolly

Powiązane problemy