如何从在MVC3 /剃刀行动响应“流”?(How to get a response “stream

2019-08-31 13:08发布

我使用MVC3,.NET4,C#。

我需要创建使用Razor视图一些XHTML。 我通过一个动作做到这一点。

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

        return View();
    }

然后,我需要从这个输出,并将其转换为Word文档。 我使用的是第三方组件做到这一点,它需要一个“流”或“文件”对于被读为转换为DOC,就像下面的XHTML来源:

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

我的问题:

什么是调用“RenderDoc”行动并获得结果作为流送入“MyXhtmlStream”的好办法。

非常感谢。

编辑:我有另一个想法!

1)渲染操作来创建一个字符串(XHTMLString)内查看。 我看到这样做对SO的方法。

2)创建一个MemoryStream并把这个字符串转换成它。

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

EDIT2:根据达林的答案

我需要clasyify远一点,我希望通过调整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的问题?

Answer 1:

我只想写一个自定义的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

在你的情况下,模型是这样的Document类或不管它被调用。



文章来源: How to get a response “stream” from an action in MVC3/Razor?