2014-04-22 4 views
4

면도기 템플릿에 변수가 괄호 안에 들어 있으면 (예 : "@ Model.B)"코드에서) 면도기 엔진이 "<"앞에 있고 공백이나 텍스트로 구분되어 있으면 해당 변수를 컴파일하고 바꾸지 못합니다. 이것은 의도 된 행동입니까? 변수가 괄호 안에 싸여 있지 않으면 템플릿은 잘 분석됩니다. 면도기가 무겁게 <에 의존RazorEngine : 작은 기호 ("<") 뒤에 나타나는 변수를 구문 분석하지 않습니다.

[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

오류 메시지가 있습니까? – ps2goat

+0

예기치 않은 결과가 발생하더라도 오류없이 컴파일되고 실행됩니다. – Sidawy

답변

1

은> 징후는 HTML로 사용할 태그를 찾을 수 있습니다.

문제를 해결하기 위해 당신은 실제 대체 텍스트

하거나 인코딩 서명 XML보다 적은 찾아 볼 <

&lt; (@Model.B) 

실제 코드는이 질문에 대해 대체지고의 XML 교체를 사용할 수 있습니다

@("<") (@Model) 

그것은 문제가되지 당신의 Model.B 정의입니다 <이다.

+0

둘 다 기술적으로 작동해야합니다. @가 면도기보다 괄호 밖의 경우 괄호를 표현식의 일부로 평가해야합니다. 그것이 내부에있는 경우 표현식 평가에 포함시키지 말고 원시 텍스트로 출력해서는 안되며 결과 문자열에 괄호 안에 GUID가 표시됩니다. – Sidawy

+0

내 답변을 편집하여 내 문제에 더욱 부합 – user2391759

-1

코드 줄에 오류가 있습니다.

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

나는 @ Model.B에 대한 참조가없는, 그래서 출력은 "<는"

는이 같은 변수를 포함 실제로해야합니다.

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

var template = "(@ Model.B)"; 그래서 @ Model.B는 거기에서 참조됩니다. – Sidawy