t4mvc actionresult转换为字符串

时间:2011-12-14 23:49:31

标签: c# asp.net asp.net-mvc asp.net-mvc-3

我正试图从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 */    
     }    
}

3 个答案:

答案 0 :(得分:3)

我做过这件事

 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");

部分只是局部视图,但是,没有任何理由不能使用完整视图。希望它有所帮助。

答案 1 :(得分:0)

您将无法使用T4MVC ActionResults执行此操作,因为它们具有空ExecuteResult()实现。

我可以看到两种显而易见的方法:

1.创建您想要调用的操作方法所在的控制器实例,然后调用它。您可能决定从ControllerFactory获取一个实例,而不是直接实例化该类,但如果您知道它是什么类型,我将直接从该类型实例化实例。

要从默认控制器工厂获取控制器,您可以使用

 ControllerBuilder.Current.GetControllerFactory().CreateController(RequestContext requestContext, string controllerName);

这将返回IController,因此您需要将其强制转换为正确的控制器类型才能调用操作方法。直接实例化一个更容易:)

2.使用电子邮件模板解决方案,例如 Postal ActionMailer MvcMailer 或Kazi的 Email Template Engine 。所有这些都利用了Razor,因此您可以获得精美的电子邮件消息。

答案 2 :(得分:0)

如果有人对答案感兴趣:

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();
}