如何从MVC3 / Razor中的动作获得响应“流”?

时间:2013-04-19 12:48:29

标签: asp.net-mvc asp.net-mvc-3

我正在使用MVC3,.NET4,C#。

我需要使用Razor View创建一些XHTML。我通过行动来做到这一点。

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

        return View();
    }

然后我需要从中获取输出并将其转换为Word Doc。我正在使用第三方组件执行此操作,它期望读取XHTML源的“流”或“文件”以转换为DOC,如下所示:

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

我的问题:

调用“RenderDoc”操作并将结果作为流提供给“MyXhtmlStream”的好方法。

非常感谢。

编辑:我有另一个想法!!!

1)在动作中渲染视图以创建String(XHTMLString)。我已经看到了在SO上执行此操作的方法。

2)创建一个MemoryStream并将此字符串放入其中。

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

EDIT2:根据Darin的回答

我需要进一步理解,我希望通过为我的目的调整Darin的代码来做到这一点。

 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?

的问题

1 个答案:

答案 0 :(得分: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);
    }
}

如果需要,您当然可以调整回复Content-Type,如果需要,还可以添加Content-Disposition标题。

然后让我的控制器操作返回此自定义操作结果:

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

现在控制器操作不再需要处理管道代码了。控制器操作执行典型的控制器操作应该执行的操作:

  1. 查询模型
  2. 将此模型传递给ActionResult
  3. 在您的情况下,模型是这个Document类或其他任何类。