RazorEngine和解析物理视图文件总是会导致异常

时间:2011-03-09 16:54:48

标签: asp.net-mvc razor

我有以下RazorEngine电话:

public class RazorEngineRender
{
    public static string RenderPartialViewToString(string templatePath, string viewName, object model)
    {            
        string text = System.IO.File.ReadAllText(Path.Combine(templatePath, viewName));
        string renderedText = Razor.Parse(text, model);
        return renderedText;
    }
}

这来自:

_emailService.Render(TemplatePath, "Email.cshtml", new { ActivationLink = activationLink });

我也有这个视图文件(email.cshtml):

    <div>
      <div>
            Link: <a href="@Model.ActivationLink" style="color:#666" target="_blank">@Model.ActivationLink</a>
      </div>
    </div>

当调用Razor.Parse()时,我总是得到一个: 无法编译模板。检查错误列表以获取详细信息。

错误列表是:

error CS1061: 'object' does not contain a definition for 'ActivationLink' and no extension method 'ActivationLink' accepting a first argument of type 'object' could be found 

我在阳光下尝试了一切,包括尝试一种具体类型而不是匿名类型,在视图文件的顶部声明@Model行但没有运气。我想知道图书馆是错还是肯定我?

顺便说一句,我所指的razorengine可以在codeplex找到: RazorEngine

3 个答案:

答案 0 :(得分:18)

如果您这样打电话:

Razor.Parse(System.IO.File.ReadAllText(YourPath), 
            new { ActivationLink = activationLink });

这应该给你正确的输出。但是,在我看到上面发布的方法之后,我将能够确定问题所在。

更新

将您的方法更改为以下内容:

public class RazorEngineRender {
    public static string RenderPartialViewToString<T>(string templatePath, string viewName, T model) {            
        string text = System.IO.File.ReadAllText(Path.Combine(templatePath, viewName));
        string renderedText = Razor.Parse(text, model);
        return renderedText;
    }
}

你可以像上面那样打电话。

它不起作用的原因是因为你告诉Parser模型是object类型而不是传递它真正的类型。在这种情况下是匿名类型。

答案 1 :(得分:6)

2011年接受的答案是完美的(我相信RazorEngine的前3版)但是这个代码现在在最新版本中被标记为过时(在输入时为3.7.3)。

对于较新版本,您的方法可以这样输入:

public static string RenderPartialViewToString<T>(string templatePath, string templateName, string viewName, T model)
        {
            string template = File.ReadAllText(Path.Combine(templatePath, viewName));
            string renderedText = Engine.Razor.RunCompile(template, templateName, typeof(T), model);
            return renderedText;
        }

为了使其正常工作,您需要添加

using RazorEngine.Templating;

答案 2 :(得分:1)

以下是您可能尝试的一些提示:

  1. 让您的剃刀视图强烈输入模型:

    @model Foo
    <div>
        <div>
            Link: 
            <a href="@Model.ActivationLink" style="color:#666" target="_blank">
                @Model.ActivationLink
            </a>
        </div>
    </div>
    
  2. 渲染时,它会传递Foo模型:

    _emailService.Render(
        TemplatePath, 
        "Email.cshtml", 
        new Foo { ActivationLink = activationLink }
    )
    
  3. 如果您尝试从观看中发送电子邮件,请确保在重新发明内容之前checkout Postal