2015-12-21 76 views
0

我剛剛將我們的RazorEngine引用更新至版本3.7.5。一堆事情似乎已經改變,並變得過時。 對於大多數情況,我想出了'新的方式',除了1件事:獲得一個ITemplate實例。如何從剃鬚刀引擎獲取ITemplate(IRazorEngineService)

我們曾經使用過一個TemplateService實例。這有一個方法Resolve,它返回一個ITemplate實例。

TemplateService被替換爲IRazorEngineService。這沒有任何方法返回ITemplate

什麼是檢索一個正確的方法?

回答

0

正如我已經在這裏一些線程一些報價討論這樣的:

你能否解釋一下原因,爲什麼你需要訪問直接在接口的實例? 我決定刪除它的直接訪問權限,因爲它不容易使用,而且大部分都不會做你認爲它的作用。如果您使用隔離API,它也會導致問題。

https://github.com/Antaris/RazorEngine/issues/225

如果其有關設置自定義佈局適當的升級路徑是使用自定義的TemplateBase並利用ViewBag的(對鏈接問題作爲討論)。

另一個更有趣的用例是獲取模板的數據OUT。 這在這裏詳細討論:https://github.com/Antaris/RazorEngine/issues/238

這裏是如何從給定模板走出「主題」一個代碼示例

模板:

@model HelloWorldModel 
@{ 
    Layout = "CI"; 
    Subject = "Hello World"; 
} 
Hello @Model.Name,<br/> 
this is a test email... 

代碼(簡體)

class CustomDataHolder { 
    public string Destination { get; set; } 
    public string Subject { get; set; } 
} 
// In the custom TemplateBase class: 
    public string Subject { get { return Viewbag.DataHolder.Subject; }; set { Viewbag.DataHolder.Subject = value; } } 

// Your code 
public static Task SendEmailAsync<T>(string templateName, string destination, T model) 
{ 
    var holder = new CustomDataHolder(); 
    dynamic viewbag = new DynamicViewBag(); 
    viewbag.DataHolder = holder; 
    holder.Destination= destination; 
    var body = Engine.Razor.Run(templateName, typeof(T), model, (DynamicViewBag)viewbag); 

    MailMessage msg = new MailMessage(); 
    msg.To.Add(new MailAddress(holder.Destination)); 
    msg.Subject = holder.Subject; 
    msg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(body, null, MediaTypeNames.Text.Html)); 

    SmtpClient smtpClient = new SmtpClient(); 
    return smtpClient.SendMailAsync(msg); 
} 

希望這涵蓋你的用例。否則,請向您的問題添加更多信息,以瞭解您嘗試使用ITemplate實例實現的目標....