【发布时间】:2016-10-10 00:08:59
【问题描述】:
我想输出两个不同的视图(一个作为将作为电子邮件发送的字符串),另一个是显示给用户的页面。
这在 ASP.NET MVC beta 中是否可行?
我尝试了多个示例:
1. RenderPartial to String in ASP.NET MVC Beta
如果我使用此示例,我会收到“HTTP 后无法重定向 标头已发送。”。
2. MVC Framework: Capturing the output of a view
如果我使用它,我似乎无法执行 redirectToAction,因为它 试图渲染一个可能不存在的视图。如果我确实返回视图,它 完全一团糟,看起来一点也不对。
是否有人对我遇到的这些问题有任何想法/解决方案,或者对更好的问题有任何建议?
非常感谢!
下面是一个例子。我要做的是创建 GetViewForEmail 方法:
public ActionResult OrderResult(string ref)
{
//Get the order
Order order = OrderService.GetOrder(ref);
//The email helper would do the meat and veg by getting the view as a string
//Pass the control name (OrderResultEmail) and the model (order)
string emailView = GetViewForEmail("OrderResultEmail", order);
//Email the order out
EmailHelper(order, emailView);
return View("OrderResult", order);
}
接受了 Tim Scott 的回答(我稍作修改和格式化):
public virtual string RenderViewToString(
ControllerContext controllerContext,
string viewPath,
string masterPath,
ViewDataDictionary viewData,
TempDataDictionary tempData)
{
Stream filter = null;
ViewPage viewPage = new ViewPage();
//Right, create our view
viewPage.ViewContext = new ViewContext(controllerContext, new WebFormView(viewPath, masterPath), viewData, tempData);
//Get the response context, flush it and get the response filter.
var response = viewPage.ViewContext.HttpContext.Response;
response.Flush();
var oldFilter = response.Filter;
try
{
//Put a new filter into the response
filter = new MemoryStream();
response.Filter = filter;
//Now render the view into the memorystream and flush the response
viewPage.ViewContext.View.Render(viewPage.ViewContext, viewPage.ViewContext.HttpContext.Response.Output);
response.Flush();
//Now read the rendered view.
filter.Position = 0;
var reader = new StreamReader(filter, response.ContentEncoding);
return reader.ReadToEnd();
}
finally
{
//Clean up.
if (filter != null)
{
filter.Dispose();
}
//Now replace the response filter
response.Filter = oldFilter;
}
}
使用示例
假设控制器调用以获取订单确认电子邮件,传递 Site.Master 位置。
string myString = RenderViewToString(this.ControllerContext, "~/Views/Order/OrderResultEmail.aspx", "~/Views/Shared/Site.Master", this.ViewData, this.TempData);
【问题讨论】:
-
如何将它与强类型视图一起使用? IE。如何将模型提供给页面?
-
不能使用这个并在之后创建 JsonResult,因为在 headers 发送后无法设置内容类型(因为 Flush 发送它们)。
-
因为没有唯一的正确答案,我想。 :) 我创建了一个特定于我的问题,但我知道它也会被广泛问到。
-
建议的解决方案在 MVC 3 中不起作用。
-
@Qua:建议的解决方案已有两年多的历史了。我也不希望它适用于 MVC 3!此外,现在有更好的方法来做到这一点。
标签: asp.net-mvc rendering