当剃刀模板的括号中包含一个变量(例如下面的代码中的“(@ 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; }
}
答案 0 :(得分:1)
Razor严重依赖&lt; &GT;找到它将用作html标签的标志。
要解决您的问题,您可以使用xml替换&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");