2012-11-11 6 views
10

Próbowałem użyć RazorEngine w małym projekcie, ale nie mogę ominąć tego błędu, gdy próbuję użyć szablonów.TemplateCompilationError z RazorEngine i Layouts

Nie można skompilować szablonu. "obiekt" nie zawiera definicji " " "Opis" i nie można zastosować metody rozszerzającej "Opis" akceptującej pierwszy argument typu "obiekt" (czy brakuje w nim dyrektywy z użyciem lub odniesienia do zespołu?)

Moja konfiguracja: mam układ szablonu takiego:

<html> 
<head> 
    <title>@Model.Description</title> 
</head> 
<body> 
    @RenderBody() 
</body> 
</html> 

a następnie szablon strony, który wygląda tak:

@{ 
    _Layout = "Layout.cshtml"; 
} 
<h1>@Model.Description</h1> 

Oto test Główną funkcją Używam spróbować i rysunek to:

static void Main(string[] args) 
    { 
     // Configuration for RazorEngine 
     var config = new TemplateServiceConfiguration 
     { 
      EncodedStringFactory = new RawStringFactory(), 

      Resolver = new DelegateTemplateResolver(name => 
      { 
       var file = name; 
       var content = File.ReadAllText("Templates/" + file); 
       return content; 
      }) 
     }; 

     // Try to render output using Razor 
     using (var service = new TemplateService(config)) 
     { 
      string template = File.ReadAllText("Templates/Default.cshtml"); 

      dynamic model = new ExpandoObject(); 
      model.Description = "This is a test"; 
      string result = service.Parse(template, model); 
      Console.WriteLine(result); 
      if (Debugger.IsAttached) 
      { 
       Console.ReadLine(); 
      } 

     } 
    } 

Każdy pomysł co mi brakuje?

Aktualizacja: Działa, jeśli zamieniam obiekt modelu dynamicznego na POCO z właściwością Opis. Próbowałem też wpisany wersję Parse z

dynamicznego

, ExpandoObject i IDictionary<string, object> ale wszystkie mają ten sam błąd.

Aktualizacja: znalazłem ten projekt na Github, który wydaje się, że praca w jakiś sposób: https://github.com/mikoskinen/graze/blob/master/src/core/Graze.cs#L174

+0

Czy to działa przy użyciu zwykłego POCO jako modelu? –

+0

Tak, ale potrzebuję, aby był dynamiczny. –

Odpowiedz

4

to myślę, że jest bardziej odpowiedni do korzystania z usługi szablonu Parse przeciążenie, że trwa ViewBag i wykorzystanie ViewBag w twoim widoku, a nie model.

Edit:

public virtual string Parse(string razorTemplate, object model, DynamicViewBag viewBag, string cacheName) 
+0

Aplikacja nie jest aplikacją MVC, więc nie mam obiektu ViewBag. –

+0

Aktualna wersja RazorEngine (https://github.com/Antaris/RazorEngine/) ma metodę Parse, która akceptuje ViewBag. To właśnie sugerowałem (patrz edycja). – Plymouth223

+0

Przepraszam, myślałem, że odnosisz się do właściwości ViewBag w ControllerBase. Nie testowałem DynamicViewBay. Ta metoda jest dla mnie myląca, ponieważ mogę przekazać "model", dlaczego chciałbym użyć viewBag? –

4

Nie można przekazać typ anonimowy w dynamicznie wpisany widzenia, ponieważ anonimowe typy są kompilowane jako wewnętrzne. Ponieważ widok CSHTML jest kompilowany w osobny zespół, nie może uzyskać dostępu do właściwości anonimowego typu.

+0

Wygląda na to, że tylko podstawowy układ ma problemy. Działa, jeśli mam tylko jeden układ i nie ma _Layout = "Layout.cshtml"; –

2

Tworzenie modelu jak ty powyżej

W szablonie Index ustawić ViewBag.Description do Model.Description

@{ 
    _Layout = "Layout.cshtml"; 
    ViewBag.Description = Model.Description; 
} 

<div>Hello John </div> 

Na stronie układu użyć viewbag zamiast modelu

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
<html> 
    <head> 
     <title>@ViewBag.Description</title> 
    </head> 
    <body> 
     <div id="content"> 
      @RenderBody() 
     </div> 
     @if (IsSectionDefined("Footer")) 
     { 
      <div id="footer"> 
       @RenderSection("Footer") 
      </div> 
     } 
    </body> 
</html> 

Nie wiem, dlaczego model dynamiczny nie może być użyty na stronie układu. W ten sposób używam go w moim projekcie

+0

Dziękujemy za kolejne obejście problemu. Nadal chciałbym wiedzieć, co jest nie tak z moim początkowym podejściem. –

+0

Nie wiem, dlaczego strona układu nie akceptuje modelu dynamicznego. Mam nadzieję, że ktoś, kto dogłębnie pozna architekturę maszynki do golenia odpowie. – ministrymason

Powiązane problemy