Во-первых, вы, вероятно, захотите вернуть представление из своего действия, поэтому возврат EmptyResult не самый лучший; но вы поймете это, когда будете иметь дело с потоком страниц в процессе регистрации.
Я предполагаю, что вы хотите создать электронную почту в формате HTML, используя вид, который вы уже создали. Это означает, что вы хотите принять результат чего-то, что выглядит как следующее:
public ActionResult CreateEmailView(RegistrationInformation info)
{
var userInformation = Membership.CreateNewUserLol(info);
return View(userInformation)
}
и отправить его в тело письма. Вы можете повторно использовать свои взгляды и все эти забавные вещи.
Вы можете воспользоваться каркасом, создав пользовательский ActionResult и используя его для генерации вашего текста.
Вот некоторый псевдокод C#, который может действительно скомпилироваться и работать. Во-первых, пользовательские ActionResult:
public class StringResult : ViewResult
{
public string Html { get; set; }
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
if (string.IsNullOrEmpty(this.ViewName))
{
this.ViewName =
context.RouteData.GetRequiredString("action");
}
ViewEngineResult result = null;
if (this.View == null)
{
result = this.FindView(context);
this.View = result.View;
}
ViewContext viewContext = new ViewContext(
context, this.View, this.ViewData, this.TempData);
using (var stream = new MemoryStream())
using (var writer = new StreamWriter(stream))
{
// used to write to context.HttpContext.Response.Output
this.View.Render(viewContext, writer);
writer.Flush();
Html = Encoding.UTF8.GetString(stream.ToArray());
}
if (result != null)
{
result.ViewEngine.ReleaseView(context, this.View);
}
}
}
Это отменяет базового метода, ExecuteResult (это код от базового метода я переопределяя, может быть изменен в RC1), чтобы оказать поток, который я контролирую вместо Выходной поток ответа. Таким образом, он выводит текст точно, как он будет отображаться на клиентской машине.
Далее, как вы могли бы использовать это в действии контроллера:
public ActionResult CreateEmailView(RegistrationInformation info)
{
var userInformation = Membership.CreateNewUserLol(info);
// grab our normal view so we can get some info out of it
var resultView = View(userInformation);
// create our string result and configure it
StringResult sr = new StringResult();
sr.ViewName = resultView.ViewName;
sr.MasterName = resultView.MasterName;
sr.ViewData = userInformation;
sr.TempData = resultView.TempData;
// let them eat cake
sr.ExecuteResult(this.ControllerContext);
string emailHtml = sr.Html;
// awesome utils package, dude
Utils.SendEmailKThx(userInformation, emailHtml);
return resultView;
}
Я рендеринга один и тот же вид в два раза; в первый раз я передаю его потоку, а во второй раз я его делаю нормально. Возможно, можно прокрасться в цепочку вызовов ViewResult где-то еще и изменить, как работает Render, но беглый взгляд на код ничего не обнаруживает. Несмотря на то, что структура довольно хороша, стек вызовов для частей процесса просто недостаточно хорош, чтобы упростить изменение одного шага в этом процессе. Если они нарушили ExecuteResult в несколько различных переопределяемых методов, мы могли бы изменить его от рендеринга к выходному потоку до рендеринга в наш поток без переопределения всего метода ExecuteResult. О хорошо ....
Можете ли вы уточнить, что вы хотите сделать? –
С псевдо? Яснее? –
Запросы веб-серверу необходимо вернуть * что-то. * Что вы ожидаете от него? HTML? JSON? Что-то другое? Или вы спрашиваете, как отправлять электронную почту? Нет, пока не ясно. –