Engine.Razor.Run导致InvalidCastException异常

Engine.Razor.Run导致InvalidCastException异常,razor,razorengine,Razor,Razorengine,我有以下代码来获取我的cshtml电子邮件模板 try { var layoutTemplateKey = new NameOnlyTemplateKey("layout", ResolveType.Global, null); if (!Engine.Razor.IsTemplateCached(layoutTemplateKey, null)) Engine.Razor.AddTempl

我有以下代码来获取我的cshtml电子邮件模板

try
            {

            var layoutTemplateKey = new NameOnlyTemplateKey("layout", ResolveType.Global, null);
            if (!Engine.Razor.IsTemplateCached(layoutTemplateKey, null))
                Engine.Razor.AddTemplate(layoutTemplateKey, ReadTemplateFile("/Views/Email/Layout.cshtml"));

            var templateKey = new NameOnlyTemplateKey(templatePath, ResolveType.Global, null);
            if (!Engine.Razor.IsTemplateCached(templateKey, viewModel.GetType()))
            {
                Engine.Razor.AddTemplate(templateKey, ReadTemplateFile(templatePath));
                Engine.Razor.Compile(templateKey, viewModel.GetType());
            }

            return viewModel == null ?
                Engine.Razor.Run(templateKey) :
                Engine.Razor.Run(templateKey, viewModel.GetType(), viewModel);

            }
            catch (Exception ex)
            {
                return ex.Message;
            }
但是,我的Engine.Razor.Run会对此处引用的型号造成
InvalidCastException

任何其他车型也会持续出现这种情况

我最近所做的更改是通过另一个模型继承这个类中的每个类,该模型将在
Layout.cshtml
中使用

预期型号:
NewBookRecievedEmailViewModel

public class NewBookRecievedEmailViewModel : EmailHelperModel
    {
        public ProposalPostedEmailViewModel()
        {
            this.canBeDeleted = true;
        }

        public string BookName { get; set; }

        public string Author {get; set;}
    }
获取模型PayOutBookEmailViewModel的错误

public class PayOutBookEmailViewModel : EmailHelperModel
    {
        public string BookID { get; set; }

        public string BookUrl {get; set;}
    }
继承的模型是:EmailHelper

public class EmailHelperModel
    {
        public bool canBeDeleted { get; set;  }
        public string DeleteUrl { get; set; }
    }
堆栈跟踪:

   at RazorEngine.Templating.TemplateBase`1.SetModel(Object model)
   at RazorEngine.Templating.TemplateBase.SetData(Object model, DynamicViewBag viewbag)
   at RazorEngine.Templating.RazorEngineCore.CreateTemplate(ICompiledTemplate template, Object model, DynamicViewBag viewbag)
   at RazorEngine.Templating.RazorEngineCoreWithCache.ResolveInternal(String cacheName, Object model, Type modelType, DynamicViewBag viewbag, ResolveType resolveType, ITemplateKey context)
   at RazorEngine.Templating.InternalTemplateService.Resolve(String name, Object model, Type modelType, DynamicViewBag viewbag, ResolveType resolveType)
   at RazorEngine.Templating.TemplateBase`1.ResolveLayout(String name)
   at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader)
   at RazorEngine.Templating.RazorEngineCore.RunTemplate(ICompiledTemplate template, TextWriter writer, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.DynamicWrapperService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass22_0.<Run>b__0(TextWriter writer)
   at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
   at RazorEngine.Templating.RazorEngineServiceExtensions.Run(IRazorEngineService service, ITemplateKey key, Type modelType, Object model, DynamicViewBag viewBag)
   at Pxp.Api.Helpers.EmailHelper.GetHtmlContent(String templatePath, Object viewModel)
at RazorEngine.Templating.TemplateBase`1.SetModel(对象模型)
位于RazorEngine.Templating.TemplateBase.SetData(对象模型,DynamicViewBag视图包)
位于RazorEngine.Templating.RazorEngineCore.CreateTemplate(ICompiledTemplate模板、对象模型、DynamicViewBag视图包)
位于RazorEngine.Templating.RazorEngineCoreWithCache.ResolveInternal(字符串缓存名称、对象模型、类型modelType、DynamicViewBag视图包、ResolveType ResolveType、ITemplateKey上下文)
位于RazorEngine.Templating.InternalTemplateService.Resolve(字符串名称、对象模型、类型modelType、DynamicViewBag视图包、ResolveType ResolveType)
在RazorEngine.Templating.TemplateBase`1.ResolveLayout(字符串名)
在RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext上下文,TextWriter阅读器)
位于RazorEngine.Templating.RazorEngineCore.RunTemplate(ICompiledTemplate模板、TextWriter编写器、对象模型、DynamicViewBag视图包)
在RazorEngine.Templating.RazorEngineService.Run(ITemplateKey键、TextWriter编写器、类型modelType、对象模型、DynamicView视图包)
在RazorEngine.Templating.DynamicWrapperService.Run(ITemplateKey、TextWriter编写器、类型modelType、对象模型、DynamicViewBag视图包)
在RazorEngine.Templating.RazorEngineServiceExtensions.c_uu显示类22_0.b_u0(TextWriter)
在RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter处(操作'1 WithWriter)
在RazorEngine.Templating.RazorEngineServiceExtensions.Run(IRazorEngineService,ITemplateKey键,Type modelType,Object model,DynamicViewBag viewBag)
位于Pxp.Api.Helpers.EmailHelper.GetHtmlContent(字符串模板路径,对象视图模型)

> p>而不是使用CSHTML,考虑使用实际HTML;或者更好的是,使用JavaScript生成元素,这是真正的方法,下面是一些如何在JavaScript中创建元素的示例代码:

var MyEngine = new (function() {
     this.el = function(opts) {
        if(!svgList.split(" ").find(x => x == opts.tag)) {
            this.node = document.createElement(opts.tag || "div");
        } else {
            this.node = document.createElementNS('http://www.w3.org/2000/svg', opts.tag);
        } 

        for(var k in opts) {
            if(k == "style") {
                for(var s in opts[k]) {
                    this.node.style[s] = opts[k][s];
                }
            } else if(k != "parent"){
                this.node[k] = opts[k];
            }
        }



        this.setAttrs = (attrs) => {
            for(var k in attrs) {
                this.node.setAttribute(k, attrs[k]);
            }
        };
        this.getAttr = (at) => {
            return this.node.getAttribute(at);
        };

        this.setStyle = (stl) => {
            for(var k in stl) {
                this.node.style[k] = stl[k];
            }
        }

        var attr = opts.attr || {};
        this.setAttrs(attr);
        var optsPar = opts.parent;
        var par = null;
        if(optsPar) {
            if(optsPar.constructor == String) {
                par = f("#" + optsPar);
            } else if(optsPar instanceof Element) {
                par = optsPar;
            }
        }

        this.parent = par || document.body || {appendChild: (d) => {}};
        this.parent.appendChild(this.node);
     };
)();
然后,要创建新元素,请执行以下操作:

var temp = new MyEngine.el({
    id:"hi",
    style:{position:absolute, left:100+"px"},
    innerHTML:"<b>nice to meet you</b>
});
var temp=new MyEngine.el({
id:“你好”,
样式:{位置:绝对,左:100+“px”},
innerHTML:“很高兴认识你
});

顺便说一句,这是一个很好的建议。