2016-03-22 68 views
0

我想編寫一個Web Api控制器操作,根據結果發送一封電子郵件。我想使用MVC視圖或部分視圖以及數據模型來呈現電子郵件的正文。Web Api控制器可以將視圖呈現爲字符串嗎?

有沒有辦法做到這一點?

我想是這樣的:

public class NotificationApiController : ApiController 
{ 
    private IMkpContext db; 

    public string ViewNotifications() 
    { 
     var dataModel = GetDataModel(); 
     if (dataModel != null) 
     { 
      SendEmail(dataModel.ToAddress, dataModel.FromAddress, dataModel.Subject, RenderBody("viewName", dataModel); 
     } 

     return string.Empty; 
    } 
} 

凡RenderBody會擡頭看的viewName,從數據模型填充數據,並渲染視圖作爲字符串。

+0

我一般用RazorEngine庫來渲染自己的看法,並使用該爲我的電子郵件。它具有額外的好處,允許您將您的視圖聲明爲強類型。 http://antaris.github.io/RazorEngine/ –

+0

爲了同一目的,我使用Postal。 https://www.nuget.org/packages/Postal.Mvc5/ –

回答

2

如果你不想將去與RazorEngine方法建議在評論中,你可以像這樣定義一個類:

public static class ViewUtil 
{ 
    public static string RenderPartial(string partialName, object model) 
    { 
     var sw = new StringWriter(); 
     var httpContext = new HttpContextWrapper(HttpContext.Current); 

     // point to an empty controller 
     var routeData = new RouteData(); 
     routeData.Values.Add("controller", "EmptyController"); 

     var controllerContext = new ControllerContext(new RequestContext(httpContext, routeData), new EmptyController()); 

     var view = ViewEngines.Engines.FindPartialView(controllerContext, partialName).View; 

     view.Render(new ViewContext(controllerContext, view, new ViewDataDictionary { Model = model }, new TempDataDictionary(), sw), sw); 

     return sw.ToString(); 
    } 
} 

class EmptyController : Controller { } 
+0

我得到了一個異常:錯誤CS0103:名稱'model'在當前上下文中不存在。我想我需要別的東西來將模型傳遞給視圖.... –