代码之家  ›  专栏  ›  技术社区  ›  Chris Charabaruk

在异常中,将视图呈现为字符串,后跟重定向结果

  •  2
  • Chris Charabaruk  · 技术社区  · 16 年前

    我相信问题的根源在于,我正在重用控制器操作中的上下文,而创建电子邮件的调用来自该操作。更具体地说,HttpResponse来自上下文。不幸的是,我无法创建使用HttpWriter的新HttpResponse,因为该类的构造函数不可访问,并且使用从TextWriter派生的任何其他类会导致response.Flush()本身引发异常。

    有人能解决这个问题吗?

        public static 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;
            //var response = new HttpResponseWrapper(new HttpResponse
            //    (**TextWriter Goes Here**));
            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;
            }
        }
    
    3 回复  |  直到 16 年前
        1
  •  2
  •   Haacked    16 年前

    你必须发起一个新的请求。 比特,你真的想以这种方式同步发送电子邮件吗?如果邮件服务器关闭,用户可能会等待很长一段时间。

    我总是把电子邮件放在一个离线队列中,并让一个服务人员将它们发送出去。为此,您可以考虑使用火花模板引擎。

    另一种方法是不重定向,而是写出一个带有元重定向标记的页面

        2
  •  2
  •   Kevin Craft    15 年前

    下面是一种将视图呈现为字符串的替代方法,该字符串永远不会导致将数据输出到响应(因此应该可以避免您的问题): http://craftycodeblog.com/2010/05/15/asp-net-mvc-render-partial-view-to-string/

    要渲染常规视图而不是局部视图,需要将“ViewEngines.Engines.FindPartialView”更改为“ViewEngines.Engines.FindView”。

        3
  •  0
  •   Neal    16 年前

    看看MVC Contrib EmailTemplateService,它正是您所追求的。

    http://mvccontrib.googlecode.com/svn/trunk/src/MVCContrib/Services/EmailTemplateService.cs

    使用reflector查看Flush内部的代码,我看不到任何干净的方法可以让您在没有大量反射和其他肮脏的情况下绕过它。

    推荐文章