asp.net mvc 4 - RazorEngine Error trying to send email -
i have mvc 4 application sends out multiple emails. example, have email template submitting order, template cancelling order, etc...
i have email service multiple methods. controller calls send method looks this:
public virtual void send(list<string> recipients, string subject, string template, object data) { ... string html = getcontent(template, data); ... } the send method calls getcontent, method causing problem:
private string getcontent(string template, object data) { string path = path.combine(basetemplatepath, string.format("{0}{1}", template, ".html.cshtml")); string content = file.readalltext(path); return engine.razor.runcompile(content, "htmltemplate", null, data); } i receiving error:
the same key used template!
in getcontent method should add new parameter templatekey , use variable instead of using htmltemplate? new order email template have neworderkey , cancelorderkey email template being used cancel order?
explanation
this happens because use same template key ("htmltemplate") multiple different templates. note way have implemented getcontent run multiple problems:
even if use unique key, example
templatevariable, trigger exception when templates edited on disk.performance: reading template file every time when template cached.
solution:
implement itemplatemanager interface manage templates:
public class mytemplatemanager : itemplatemanager { private readonly string basetemplatepath; public mytemplatemanager(string basepath) { basetemplatepath = basepath; } public itemplatesource resolve(itemplatekey key) { string template = key.name; string path = path.combine(basetemplatepath, string.format("{0}{1}", template, ".html.cshtml")); string content = file.readalltext(path); return new loadedtemplatesource(content, path); } public itemplatekey getkey(string name, resolvetype resolvetype, itemplatekey context) { return new nameonlytemplatekey(name, resolvetype, context); } public void adddynamic(itemplatekey key, itemplatesource source) { throw new notimplementedexception("dynamic templates not supported!"); } } setup on startup:
var config = new templateserviceconfiguration(); config.debug = true; config.templatemanager = new mytemplatemanager(basetemplatepath); engine.razor = razorengineservice.create(config); and use it:
// don't need method anymore. private string getcontent(string template, object data) { return engine.razor.runcompile(template, null, data); } razorengine fix problems mentioned above internally. notice how fine use name of template key, if in scenario name need identify template (otherwise cannot use nameonlytemplatekey , need provide own implementation).
hope helps. (disclaimer: contributor of razorengine)
Comments
Post a Comment