Шаблоны e-mail'ов в ASP.NET MVC

01.04.2011 21:39 / Артём Волк / 772 просмотра / ...

По аналогии с решением для WebForms, в ASP.NET MVC можно использовать для генерации текста e-mail'ов обычные view. Работающее решение нашлось на одном, к сожалению, не отзывающемся сейчас сайте.

using System;
using System.Web.Mvc;
using System.Web.UI;
using System.Text;
using System.IO;

namespace CrispStudio.Routine.Templates
{
	public static class RenderViewToString
	{
		/*
		 * http://msug.vn.ua/blogs/bobasoft/archive/2010/01/07/render-partialview-to-string-asp-net-mvc.aspx
		 */
		public static string RenderPartialView(ControllerContext context, string partialViewName, object viewData)
		{
			ViewEngineResult result = ViewEngines.Engines.FindPartialView(context, partialViewName);

			if (result.View != null)
			{
				StringBuilder sb = new StringBuilder();
				using (StringWriter sw = new StringWriter(sb))
				{
					using (HtmlTextWriter output = new HtmlTextWriter(sw))
					{
						ViewContext viewContext = new ViewContext(context, result.View, new ViewDataDictionary(viewData), new TempDataDictionary(), output);
						result.View.Render(viewContext, output);
					}
				}

				return sb.ToString();
			}

			return String.Empty;
		}


		public static string RenderView(ControllerContext context, string viewName, object model, ViewDataDictionary additional = null)
		{
			ViewEngineResult result = ViewEngines.Engines.FindView(context, viewName, String.Empty);

			if (result.View != null)
			{
				StringBuilder sb = new StringBuilder();
				using (StringWriter sw = new StringWriter(sb))
				{
					using (HtmlTextWriter output = new HtmlTextWriter(sw))
					{
						var viewData = new ViewDataDictionary(model);
						if (additional != null && additional.Count > 0)
						{
							foreach (var item in additional)
							{
								viewData.Add(item);
							}
						}

						ViewContext viewContext = new ViewContext(context, result.View, viewData, new TempDataDictionary(), output);
						result.View.Render(viewContext, output);
					}
				}

				return sb.ToString();
			}

			return String.Empty;
		}
	}
}