2016-03-22 11 views
0

結果に応じて電子メールを送信するWeb Apiコントローラアクションを書きたいと思います。私は、電子メールの本文をレンダリングするために、データのモデルでMVCビューまたは部分ビューを使用したいと思います。Web Apiコントローラはビ​​ューを文字列としてレンダリングできますか?

これを行う方法はありますか? RenderBodyがたviewNameを検索する場所

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

は、データモデルからのデータを移入し、文字列として表示をレンダリング:

私はこのような何かをしたいと思います。

+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: 'モデル'という名前は現在のコンテキストに存在しません。ビューにモデルを渡すために何か必要があると思います.... –

関連する問題