为了账号安全,请及时绑定邮箱和手机立即绑定

如何将ASP.NET MVC视图呈现为字符串?

如何将ASP.NET MVC视图呈现为字符串?

墨色风雨 2019-05-27 14:58:46
如何将ASP.NET MVC视图呈现为字符串?我想输出两个不同的视图(一个作为将作为电子邮件发送的字符串),另一个显示给用户的页面。这是否可以在ASP.NET MVC beta中使用?我尝试过多个例子:1. ASP.NET MVC Beta中的RenderPartial到String如果我使用此示例,则会收到“在HTTP标头发送后无法重定向”。2. MVC框架:捕获视图的输出如果我使用它,我似乎无法执行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();     }
查看完整描述

3 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

这个答案不在我的路上。这最初来自https://stackoverflow.com/a/2759898/2318354, 但在这里我已经展示了将它与“静态”关键字一起使用的方法,使其适用于所有控制器。

为此,你必须static在类文件中创建类。(假设您的类文件名是Utils.cs)

这个例子是For Razor。

Utils.cs

public static class RazorViewToString{
    public static string RenderRazorViewToString(this Controller controller, string viewName, object model)
    {
        controller.ViewData.Model = model;
        using (var sw = new StringWriter())
        {
            var viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
            var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, 
            sw);
            viewResult.View.Render(viewContext, sw);
            viewResult.ViewEngine.ReleaseView(controller.ControllerContext, viewResult.View);
            return sw.GetStringBuilder().ToString();
        }
    }}

现在,您可以通过将“this”作为参数传递给Controller,在控制器文件中添加NameSpace,从控制器调用此类。

string result = RazorViewToString.RenderRazorViewToString(this ,"ViewName", model);

根据@Sergey给出的建议,这个扩展方法也可以从cotroller调用,如下所示

string result = this.RenderRazorViewToString("ViewName", model);

我希望这对你使代码干净整洁有用。


查看完整回答
反对 回复 2019-05-27
  • 3 回答
  • 0 关注
  • 906 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信