Asp.net mvc 如何得到回应;溪流;来自MVC3/Razor中的一个动作?

Asp.net mvc 如何得到回应;溪流;来自MVC3/Razor中的一个动作?,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,我正在使用MVC3、.NET4、C 我需要使用Razor视图创建一些XHTML。我通过一个动作来做到这一点 public ActionResult RenderDoc(int ReportId) { //A new document is created. return View(); } 然后我需要从中获取输出并将其转换为Word文档。我正在使用一个第三方组件来实现这一点,它希望XHTML源有一个“流”或“文件”,可以读入以转换为文档

我正在使用MVC3、.NET4、C

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

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

        return View();
    }
然后我需要从中获取输出并将其转换为Word文档。我正在使用一个第三方组件来实现这一点,它希望XHTML源有一个“流”或“文件”,可以读入以转换为文档,如下所示:

document.Open(MyXhtmlStream,FormatType.Html,XHTMLValidationType.Transitional);
我的问题:

调用“RenderDoc”操作并将结果作为流输入“MyXhtmlStream”的好方法是什么

非常感谢

编辑:我有另一个想法

1) 在操作中呈现视图以创建字符串(XHTMLString)。我已经看到了这样做的方法

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

Stream MyStream = New MemoryStream("XHTMLString and encoding method");
EDIT2:根据达林的回答

我需要进一步分类,我希望通过调整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?”的问题。

我只需编写一个自定义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);
}
现在控制器操作不再需要处理管道代码。控制器操作执行典型控制器操作应该执行的操作:

  • 查询模型
  • 将此模型传递给ActionResult

  • 在你的例子中,模型是这个
    文档
    类或任何它被称为的东西。

    你真的无法从操作中获得它。这还为时过早。当你说//创建一个新文档时,你在那一点上有一个流吗?或者你是从某处检索这个文档吗?我没有流。基本上我只是使用了一个Razor视图,通过“RenderDoc”“操作,以创建XHTML。然后我想把它转换成一个文档。从逻辑上讲,我希望将对该操作的调用合并到open方法中,但它并不像这样简单。您是从屏幕上的内容还是从用户正在上载的内容创建文档?我是从存储的数据创建文档,因此Razor视图将此数据呈现为XHTML,然后将其转换为Word。我刚刚有了另一个想法。见编辑。嗨,达林,谢谢你。非常全面。我要补充的一点是,我将ReportId传递给视图,并通过它将所有报表成分组合在一起。因此Return View()确实会返回呈现的XHTML。在您的示例中,我看不出Razor代码是从哪里来的。是的,我需要将“Document Document=repository.GetDocument(reportId);”替换为对另一个操作的调用,该操作调用创建XHTML的Razor视图,或者通过直接调用Razor引擎创建内联字符串。。。。我已经看过solutios了。我添加了一个编辑,希望能澄清。我仍然有一个问题,就是如何将“strXhtmlDocument”放入“Response.OutputStream”,除非我遗漏了什么?非常感谢您的帮助。谢谢。