呈现视图字符串,然后在例外重定向结果(Render view to string followed

2019-07-30 10:07发布

因此,这里的问题:我建立电子邮件将通过我的应用程序通过渲染完整视图页面为字符串并将它们发送发送。 因为我不是重定向到另一个网址的网站上以后这工作没有任何问题,所以长。 每当我尝试,我得到“System.Web.HttpException:HTTP标头之后被送往不能重定向。”

我认为,问题来自我重用从控制器动作,其中呼吁创建电子邮件来自上下文的事实。 更具体地,从上下文获取HttpResponse。 不幸的是,我不能创建一个新的HttpResponse,使得使用HttpWriter的,因为类的构造函数不可达,并使用自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;
        }
    }

Answer 1:

你必须发起一个新的请求。 位,你真的要发送电子邮件同步这样? 如果邮件服务器关闭时,用户可能会等待了好一会儿。

我总是把电子邮件脱机队列,并有一个服务邮箱当中。 你可能会考虑使用Spark模板引擎这一点。

另一种方法是不定向但与元重定向代码写出来的网页



Answer 2:

下面是用于呈现的视图到从不导致数据被输出到响应(因此应避免您的问题)的字符串的替代方法: http://craftycodeblog.com/2010/05/15/asp-net-mvc -render-局部视图到字符串/

为了使常规视图,而不是一个局部视图,你需要改变“ViewEngines.Engines.FindPartialView”到“ViewEngines.Engines.FindView”。



Answer 3:

看一看在MVC的Contrib EmailTemplateService这不正是你所追求的。

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

对不起克里斯,搞不清我在想什么,但我显然没有阅读问题。 虽然我不能给你解决的办法,我可以告诉你为什么你所得到的错误 - HttpResponse.Flush()的内容刷新到过滤器,然后发送头。 所以,当你尝试重定向你得到的异常此设置响应里面的标志。

使用反射来看看里面冲洗的代码,我看不出你来解决这个问题没有大量的反射和其他污秽任何清洁方式。



文章来源: Render view to string followed by redirect results in exception