날개를 볼 수 있습니다
-
03-07-2019 - |
문제
사용자에게 확인 이메일을 보낼 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);
}
}
}
}
}
}