t4mvc actionresult转换为字符串
本文关键字:字符串 转换 actionresult t4mvc | 更新日期: 2023-09-27 18:18:06
我试图从T4MVC ActionResult中获得执行调用,并从我的EmailService类中的静态函数中获得整个字符串。如有任何帮助,不胜感激
像这样
static string ExecuteAction(ActionResult result)
{
/* Code goes here */
}
这样我就可以像这样调用函数
public static class EmailService
{
public static bool SendWelcomeEmail(string name, string email)
{
var message = ExecuteAction(MVC.Emails.WelcomeEmail(name, email));
/* Other code */
}
}
我就是这么做的
protected virtual string RenderPartialViewToString(string viewName, object model)
{
if (string.IsNullOrEmpty(viewName))
viewName = ControllerContext.RouteData.GetRequiredString("action");
ViewData.Model = model;
using (StringWriter sw = new StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
你可以这样实现
string body = RenderPartialViewToString("PasswordChangedEmail");
偏视图只是一个偏视图,然而,没有任何理由不能使用完整视图。
您将无法使用T4MVC ActionResults来做到这一点,因为它们有一个空的ExecuteResult()
实现。
我可以看到两种明显的方法:
1。创建一个您希望调用的动作方法所在的控制器实例,然后调用它。您可以决定从ControllerFactory获取实例,而不是直接实例化类,尽管如果您知道它是什么类型,我会直接从类型实例化一个实例。
从默认的控制器工厂获取一个控制器,你可以使用
ControllerBuilder.Current.GetControllerFactory().CreateController(RequestContext requestContext, string controllerName);
返回IController
,因此您需要将其强制转换为正确的控制器类型,以便调用操作方法。直接实例化一个更容易:)
2。使用电子邮件模板解决方案,如Postal, ActionMailer, MvcMailer或Kazi的电子邮件模板引擎。
如果有人对答案感兴趣:
private static RequestContext RequestContext(this HttpContext context)
{
var httpContextBase = new HttpContextWrapper(context);
var routeData = new RouteData();
return new RequestContext(httpContextBase, routeData);
}
private static RouteData GetRoute(this ActionResult url)
{
var data = url.GetRouteValueDictionary();
var route = new RouteData();
foreach (var item in data)
route.Values[item.Key] = item.Value;
return route;
}
public static string ExecuteAsString(this T4MVC_ActionResult result)
{
var controllerName = result.Controller;
var context = HttpContext.Current.RequestContext();
context.RouteData = result.GetRoute();
var controller = (ControllerBase)ControllerBuilder.Current.GetControllerFactory().CreateController(context, controllerName);
controller.ControllerContext = new ControllerContext(context, controller);
var htmlHelper = new HtmlHelper(new ViewContext(
controller.ControllerContext,
new WebFormView(controller.ControllerContext, "HACK"),
new ViewDataDictionary(),
new TempDataDictionary(),
new StringWriter()),
new ViewPage());
return htmlHelper.Action(result).ToString();
}