RazorEngine:不解析小于号后出现的变量(“<”)

时间:2014-04-22 20:40:58

标签: c# razor razorengine

当剃刀模板的括号中包含一个变量(例如下面的代码中的“(@ Model.B)”)时,剃刀引擎无法编译并替换该变量(如果前面带有“<”)并以空格或文字分隔。这是预期的行为吗?如果变量未包含在括号中,则解析模板就好了。

[Test]
public void TestWeirdLangleBracketError()
{
    var template = "(@Model.B)";
    var model = new Model { B = Guid.NewGuid().ToString() };
    var templateService =
        new TemplateService(new TemplateServiceConfiguration { EncodedStringFactory = new RawStringFactory() });

    //It is replaced here
    //Result of Try1: "(f9e0f220-0df8-4942-9d84-e403c622af96)"
    templateService.Compile(template, typeof(Model), "Try1");
    Assert.True(templateService.Run("Try1", model, null).Contains(model.B));
    //But not here
    //Result of Try2: " < (@Model.B)"
    templateService.Compile(" < " + template, typeof(Model), "Try2");
    Assert.False(templateService.Run("Try2", model, null).Contains(model.B));
}

public class Model
{
    public string B { get; set; }
}

2 个答案:

答案 0 :(得分:1)

Razor严重依赖&lt; &GT;找到它将用作html标签的标志。

要解决您的问题,您可以使用xml替换&lt;

&lt; (@Model.B) 

实际代码在答案中被替换为低于为实际替换文本编码的符号xml

或者

@("<") (@Model)

它是&lt;这不是您Model.B定义的问题。

答案 1 :(得分:-1)

您的代码行中存在错误。

templateService.Compile(" < " + template, typeof(Model), "Try2");

我没有引用@ Model.B,所以它只输出“&lt;”

你需要实际包含变量,就像这样。

templateService.Compile(" < (@Model.B)" + template, typeof(Model), "Try2");