문제

사용자에게 확인 이메일을 보낼 ASP.NET MVC 응용 프로그램을 개발 중입니다. 이메일 자체의 경우보기를 만들고 해당보기를 렌더링하고 .NET 메일 객체를 사용하여 보내고 싶습니다.

MVC 프레임 워크를 사용하여 어떻게해야합니까?

도움이 되었습니까?

해결책 2

Richard의 답변에 대한 내 의견에 따라이 코드는 작동했지만 HTTP 헤더가 전송 된 후에는 항상 '오류가 전송 된 후에는 리디렉션 할 수 없습니다.

많은 Google을 파고 좌절감을 느끼면서 마침내이 기사에서 트릭을 수행하는 몇 가지 코드를 찾았습니다.

http://mikehadlow.blogspot.com/2008/06/mvc-framework-capturing output-of-view_05.html

이 사람의 방법은 자신의 httpcontext를 만드는 것입니다.

MVCContrib Blockrenderer를 사용하는 대신 현재 HTTPContext를 StringWriter에게 쓰는 응답을 호스팅하는 새로운 httpContext를 간단히 바꿉니다.

이 방법은 완벽하게 작동합니다 (사소한 차이점은 부분적인 견해를 렌더링하기위한 별도의 동작을 만들어야하지만 드라마는 없다는 것입니다).

다른 팁

기본적으로 사용해야합니다 IView.Render. 사용하여보기를 얻을 수 있습니다 ViewEngineCollection.FindView (ViewEngines.Engines.FindView 기본값의 경우). 출력을 a로 렌더링합니다 TextWriter 그리고 당신이 전화하십시오 ViewEngine.ReleaseView 나중에. 아래 샘플 코드 (테스트되지 않은) :

StringWriter output = new StringWriter();

string viewName = "Email";
string masterName = "";

ViewEngineResult result = ViewEngines.Engines.FindView(ControllerContext, viewName, masterName);

ViewContext viewContext = new ViewContext(ControllerContext, result.View, viewData, tempData);
result.View.Render(viewContext, output);

result.ViewEngine.ReleaseView(ControllerContext, result.View);

string viewOutput = output.ToString();

나는 당신에게 ViewData / tempData를 남겨 둘 것입니다.

이것은 나를 위해 효과가있었습니다.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;

namespace Profiteer.WebUI.Controllers
{
    public class SampleController : Controller
    {
        public ActionResult Index()
        {
            RenderViewAsHtml(RouteData.Values["controller"].ToString(), 
                             RouteData.Values["action"].ToString());
            return View();
        }

        private void RenderViewAsHtml(string controllerName, string viewName)
        {
            var vEngine = (from ve in ViewEngineCollection
                           where ve.GetType() == typeof(RazorViewEngine)
                           select ve).FirstOrDefault();
            if (vEngine != null)
            {
                var view = 
                    vEngine.FindView(
                        ControllerContext, 
                        viewName, "_Layout", false).View as RazorView;
                if (view != null)
                {
                    var outPath = 
                       Server.MapPath(
                          string.Format("~/Views/{0}/{1}.html", 
                                        controllerName, viewName));
                    using (var sw = new StreamWriter(outPath, false))
                    {
                        var viewContext = 
                            new ViewContext(ControllerContext, 
                                            view, 
                                            new ViewDataDictionary(), 
                                            new TempDataDictionary(), 
                                            sw);
                        view.Render(viewContext, sw);
                    }
                }
            }
        }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top