我想在asp.net mvc中使用我的Action作为模板引擎,导致字符串的形式,我可以通过电子邮件发送。
伪代码:
public ActionResult Register() { SendEmail(View().ToString()); return new EmptyResult(); }
解决方法
首先,您仍然可能希望从您的操作返回一个视图,因此返回一个EmptyResult不是最好的;但是,当您在注册过程中处理页面流时,您会得出结论。
我假设您希望使用您已经创建的View创建一个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方法。好吧….