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 */    
     }    
}

t4mvc actionresult转换为字符串

我就是这么做的

 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。使用电子邮件模板解决方案,如PostalActionMailerMvcMailer或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();
}