2013-08-04 11 views
7

Używam RazorEngine bez MVC-Framework. Oznacza to, że nie mam narzędzia HtmlHelper do tworzenia szablonów.Korzystanie-Oświadczenie w RazorEngine (bez HtmlHelper od MVC)

W porządku, nie potrzebuję z tego żadnych metod. Ale muszę stworzyć własne metody, takie jak BeginForm.

Teraz robimy to za pomocą HtmlHelper.ViewContext.Writer.Write, którego nie mam. Czy jest to "wyskakujące z pudełka" - czy to konieczne, czy muszę tu zrobić magię?

+0

Używasz [Bocznej strony strony] (http://www.asp.net/web-pages/overview/getting-started/aspnet-web-pages- (razor) -faq) lub tylko [RazorEngine] (http://razorengine.codeplex.com/)? –

+0

Używam czystego RazorEngine z repozytorium github (więc drugi link) – Richard

Odpowiedz

11

Urządzenie RazorEngine zostało zaprojektowane z wykorzystaniem własnych typów do wykorzystania w samym silniku.

Pierwszy tworzyć własne Pomocnicy:

public class RazorHtmlHelper 
{ 
    public IEncodedString Partial(string viewName) 
    { 
     ITemplate template = RazorEngine.Razor.Resolve(viewName); 

     ExecuteContext ec = new ExecuteContext(); 

     RawString result = new RawString(template.Run(ec)); 

     return result; 
    } 
} 

public class RazorUrlHelper 
{ 
    public string Encode(string url) 
    { 
     return System.Uri.EscapeUriString(url); 
    } 
} 

Następny stworzyć własny szablon:

public class RazorTemplateBase<T> : TemplateBase<T> 
{ 
    private RazorUrlHelper _urlHelper = new RazorUrlHelper(); 

    private RazorHtmlHelper _htmlHelper = new RazorHtmlHelper(); 

    public RazorUrlHelper Url 
    { 
     get 
     { 
      return this._urlHelper; 
     } 
    } 

    public RazorHtmlHelper Html 
    { 
     get 
     { 
      return this._htmlHelper; 
     } 
    } 
} 

Przed analizowaniem ustawić TemplateServiceConfiguration:

Razor.SetTemplateService(new TemplateService(
    new TemplateServiceConfiguration() 
    { 
    BaseTemplateType = typeof(RazorTemplateBase<>) 
    }; 
)); 

result = RazorEngine.Razor.Parse(templateText, model); 

Teraz RazorEngine ma @Html.Partial() i @Url.Encode() dostępne w widokach.

+0

Dziękuję za odpowiedź. To właściwie coś, co wiedziałem. Ale nie wiem, jak zaimplementować funkcję podobną do BeginForm (z interfejsem IDisposable). – Richard

+0

A więc prawdopodobnie szukasz [Stworzenia pomocnika maszynki do gry MVC3 podobnego do Helper.BeginForm()] (http://stackoverflow.com/questions/7196276/creating-mvc3-razor-helper-like-helper-beginform). –

+0

Dziękuję za odpowiedź, ale ten przykład używa HTMLHelper, który dostarcza ViewContext.Writer - którego nie mam – Richard

Powiązane problemy