我正在使用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?
的问题答案 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);
}
现在控制器操作不再需要处理管道代码了。控制器操作执行典型的控制器操作应该执行的操作:
在您的情况下,模型是这个Document
类或其他任何类。