En primer lugar, es probable que desee devolver una vista de su acción, por lo que devolver un EmptyResult no es el mejor; pero lo sabrá cuando esté lidiando con el flujo de páginas en su proceso de registro.
Supongo que desea crear un correo electrónico HTML utilizando una Vista que ya ha creado. Eso significa que usted desea tomar el resultado de algo que se parece a lo siguiente:
public ActionResult CreateEmailView(RegistrationInformation info)
{
var userInformation = Membership.CreateNewUserLol(info);
return View(userInformation)
}
y enviar que a medida que el cuerpo del correo electrónico. Puedes volver a utilizar tus puntos de vista y todas esas cosas divertidas.
Puede aprovechar el marco creando un ActionResult personalizado y usándolo para generar su texto.
Aquí hay un pseudocódigo de tipo C# que en realidad podría compilar y funcionar. En primer lugar, la ActionResult personalizado:
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);
}
}
}
Esto anula el método de base ExecuteResult (este es el código del método de base que estoy anulando; puede haber cambiado en RC1) para rendir a un arroyo que yo controlo en lugar de la Flujo de salida de la respuesta. Por lo tanto, extrae el texto exactamente cómo se representaría en la máquina del cliente.
A continuación, como se puede utilizar esto en una acción de controlador:
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;
}
Estoy prestando la misma vista en dos ocasiones; la primera vez que la renderizo en una secuencia y la segunda vez la renderizo normalmente. Es posible colarse en la cadena de llamadas de ViewResult en otro lugar y cambiar la forma en que Render opera, pero una mirada rápida al código no revela nada. Si bien el marco es bastante bueno, la pila de llamadas para partes del proceso no es lo suficientemente fina como para que sea fácil cambiar un solo paso en el proceso. Si rompieron ExecuteResult en unos pocos métodos reemplazables diferentes, podríamos haberlo cambiado de renderizado a flujo de salida para renderizar a nuestra corriente sin anular todo el método ExecuteResult. Oh, bueno ...
¿Puede aclarar lo que quiere hacer? –
con pseudo? ¿Está más claro? –
Las solicitudes a un servidor web tienen que devolver * algo. * ¿Qué esperas que devuelva? HTML? JSON? ¿Algo más? ¿O preguntas cómo enviar un correo electrónico? No, aún no está claro. –