6

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

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

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

        return View();
    }

然后我需要从中获取输出并将其转换为 Word Doc。我正在使用第 3 方组件来执行此操作,它需要读取用于转换为 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:基于达林的回答

我需要进一步分类,我希望通过调整达林的代码来达到我的目的。

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

以上更接近我的需要。请注意第 3 方 WordDocument 类型。所以仍然存在如何将“strXhtmlDocument”放入“Response.OutputStream”的问题?

4

1 回答 1

6

我只想写一个自定义的 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或其他名称。

于 2013-04-19T13:20:44.407 回答