2011-12-14 17 views
0

我想從T4MVC ActionResult獲取以執行該調用並從我的EmailService類中的靜態函數中獲取整個字符串。任何幫助,將不勝感激t4mvc actionresult轉換爲字符串

像這樣的事情

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

什麼是你想達到什麼目的?應該返回什麼字符串? – 2011-12-14 23:53:05

+0

從視圖設計和建立電子郵件模板 – Kyle 2011-12-14 23:58:23

回答

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

部分只是局部視圖,但是,沒有任何理由不能使用全視圖。希望能幫助到你。

+0

感謝您的支持,但它並不完美,因爲我沒有控制器上下文 – Kyle 2011-12-15 00:41:44

+0

爲什麼不呢?你在哪裏試圖執行控制器操作? – jason 2011-12-15 01:55:44

0

您將無法使用T4MVC ActionResults來執行此操作,因爲它們具有空的ExecuteResult()實現。

我可以看到兩個明顯的方式,你可以接近這樣的:

1.創建控制器的一個實例上的操作方法就在於,你想打電話,然後調用它。你可以決定從ControllerFactory中獲取一個實例,而不是直接實例化類,但如果你知道它是什麼類型的話,我會直接從類型實例化一個實例。

擺脫默認控制器工廠控制器,你可以使用

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

這將返回IController所以你需要將它轉換爲正確的控制器類型,以便調用操作方法。它更容易直接實例:)

2.使用電子郵件模板解決方案,例如PostalActionMailerMvcMailer或卡子的Email Template Engine。所有利用剃刀,所以你可以有很好的模板電子郵件。

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