2013-04-19 2 views
6

MVC3, .NET4, C#을 사용하고 있습니다.MVC3/Razor의 작업에서 "스트림"응답을 얻으려면 어떻게해야합니까?

면도기 뷰를 사용하여 일부 XHTML을 만들어야합니다. 나는 이것을 행동으로한다.

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

     return View(); 
    } 

다음 출력을 가져와 Word 문서로 변환해야합니다. 다음처럼 "스트림"또는 DOC로 변환에서 읽을 수있는 XHTML 소스에 대한 "파일을"나는이 작업을 수행하는 제 3 자 구성 요소를 사용하고 있으며 기대 :

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

내 질문 :

"RenderDoc"작업을 호출하고 그 결과를 "MyXhtmlStream"으로 보내는 스트림으로 얻는 좋은 방법은 무엇입니까?

감사합니다.

편집 : 다른 아이디어가 있습니다!

1) 동작 내에서보기를 렌더링하여 문자열 (XHTMLString)을 만듭니다. 나는 이렇게하는 방법을 보았다.

2) MemoryStream을 만들고이 문자열을 그 안에 넣습니다.

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

EDIT2 : 대린의 대답

바탕으로 좀 더 clasyify해야하고, 나는 내 목적을 위해 대린의 코드를 조정을 통해이 작업을 수행 할 수 있도록 노력하겠습니다.

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

위의 내용이 내가 필요한 것입니다. 타사 WordDocument 형식을 유의하십시오. 그래서 나는 "strXhtmlDocument"얼마나의 문제는 "Response.OutputStream에 여전히 존재

+0

당신은 실제로 행동에서 그것을 얻을 수 없습니다. 파이프 라인에서 너무 일찍. –

+0

// 새 문서가 생성되면 그 시점에 스트림이 있습니까?아니면 어딘가에서이 문서를 가져오고 있습니까? – Robert

+0

스트림이 없습니다. 기본적으로 나는 방금 Render View를 사용하여 "RenderDoc"Action을 통해 XHTML을 만들었습니다. 그런 다음 이것을 DOC로 변환하려고합니다. 논리적으로 필자는이 작업에 대한 호출을 공개 메서드에 통합하려고했지만이 작업은 간단하지 않습니다. – SamJolly

답변

5

내가 그냥 처리하기 위해 사용자 정의 ActionResult를 작성합니다?

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

물론 응답을 조정 당신은 수를 .

public ActionResult RenderDoc(int reportId) 
{ 
    Document document = repository.GetDocument(reportId); 
    return new XmlDocumentResult(document); 
} 
012 : 당신이 원하는 경우도 Content-Disposition 헤더를 추가 Content-Type 필요한 경우 다음

그리고를 단순히 내 컨트롤러 액션 반환이 사용자 지정 작업 결과를

이제 컨트롤러 조치가 더 이상 배관 코드를 처리 할 필요가 없습니다. 모델이 Document 클래스 또는 무엇이든 그 것이다

  1. 쿼리 모델
  2. 패스이 모델을 귀하의 경우에 ActionResult

에 : 컨트롤러의 동작은 전형적인 컨트롤러 액션은 어떻게해야 무엇합니까 호출됩니다.

+0

안녕하세요 대린, 감사합니다. 매우 포괄적입니다. 여기에 추가 할 점은 ReportId를보기로 전달한다는 것이고 모든 보고서 구성 요소를 함께 모으는 것입니다. 그래서 Return View()는 말 그대로 렌더링 된 XHTML을 반환합니다. Razor 비트가 들어오는 예에서 볼 수 없습니다. – SamJolly

+0

예, "Document document = repository.GetDocument (reportId);"를 바꿔야합니다. 내 XHTML을 생성하는 Razor View를 호출하는 또 다른 Action을 호출하거나, Razor Engine에 대한 직접 호출을 통해 인라인으로 문자열을 생성합니다. – SamJolly

+0

잘하면 분명히하는 편집을 추가했습니다. 나는 여전히 "strXhtmlDocument"를 "Response.OutputStream"으로 가져 오는 방법에 문제가있다. 뭔가 빠진 것이 아니라면? 큰 도움에 감사하게 생각한다. 고마워. – SamJolly

관련 문제