2015-07-29 11 views
9

Szukałem tego "Świętego Graala" przez długi czas. Przeszedłem przez ogromną liczbę wtyczek, projektów, rozwiązań itp. Każde rozwiązanie czegoś pominęło. Ale przede wszystkim najpierw.Używanie silnika szablonowego Razor poza MVC (z pełną obsługą maszynki do golenia)

Co chcemy osiągnąć jest mieć możliwość spotkania renderowania widok na ciąg (zaczerpnięte z mvc aplikacji) Oczywiście cała proccess powinny być wykonane jako klasa biblioteki (nie aplikacji MVC)

Co by się spodziewać jest trzy postępy procesu kroku jak to:

  1. Instal „jakiś plugin” od Nuget i skonfigurowane
  2. Kopiuj-Wklej model i Widoki z aplikacji MVC do projektu biblioteki klasy (UWAGA !!! Widoki kopiowane bez jakiejkolwiek modyfikacji potrzebnych do "dostosuj" widoki do "jakiejś wtyczki")
  3. napisać kilka wierszy kodu, mówiąc: „Hello my«jakiś plugin»- renderowanie mi pogląd o nazwie:«myExampleView.cshtml»”

Jeden ważny warunek: Czekam dokładnie takie samo wsparcie jak w widokach uzyskiwałbym widoki w MVC (@Html, @RenderBody @RenderSection itp.)

I w rezultacie ten widok zostałby zmieniony jako ciąg - tak prosty. Czy to możliwe, czy tylko "śnię"? Która wtyczka oferuje wszystko (i może jeszcze więcej?))

Na razie - najbliższy temu opisowi był RazorEngine, ale nie widzę możliwości przekazania nazwy widoku csthml (wystarczyłoby przekazać ścieżkę do cshtml view) Oczywiście mogę napisać kod, aby załadować zawartość pliku do napisu i przekazać go do metody RunCompile, ale jeśli byłaby jakakolwiek "RederSection" - nie byłaby obsługiwana poprawnie (przynajmniej zakładam, że nie będzie)

Podsumowując: Chcę brzytwa MVC (użyteczność jest taka sama jak w aplikacji MVC. W rzeczywistości widoki z aplikacji MVC byłyby po prostu skopiowane do tej biblioteki klasowej) W tej bibliotece klasowej mogę odwoływać się do wszystkiego (w tym wspomnianego System.Web). , co nazwałbym moim "idealnym rozwiązaniem"

co chcę zadzwonić:

namespace Example 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string renderedView = MyDreamRazoEngine.Render("MyView", new MyViewModel() { Prop1= "a", Prop2 = "b", Prop3= new List<string>() { "c", "d", "e"}) 
     } 
    } 
} 

gdzie modelu (znajduje się w /Model/MyViewModel.cs) definicja brzmi:

namespace Example.Models 
{ 
    public class MyViewModel() 
    { 
     public string Prop1{get;set;} 
     public string Prop2{get;set;} 
     public List<string> Prop3{get;set;} 
    } 
} 

i widok MyView (znajduje się w/view/MyView. cshtml) definicja:

@model Example.Models.MyViewModel 
This is my view with Prop1 : @Prop1 and Prop2 : @Prop2 and list : 
@foreach (var p in @Model.Prop3) 
{ 
    @{Html.RenderPartial("viewPartial", @p);} 
} 

i częściowy widok viewPartial (znajduje się w /View/viewPartial.cshtml) definicja:

@model String 

<span>I present this param3 value @Model</span> 

Z tego co wiem, wszystko (z wyjątkiem obsługi "automatycznych" plików) jest możliwe do osiągnięcia przy użyciu projektu RazorEngine. Ale może obsługa plików (dokładnie taka sama jak w MVC - wyszukiwanie szablonów w widokach i podkatalogach wyświetleń) jest dostępna w tym silniku? Czy jest to coś, co muszę napisać sam? A może inna wtyczka daje mi wszystkie te funkcje?

@@ UPDATE

Anish skierować mnie do tego rozwiązania: razor media type formatter for webapi

Wykorzystuje razorengine i wspierać widoki, dokładnie w taki sam sposób jak w aplikacji MVC (prawie), ale ... to nie działa (na pewno brakuje mi czegoś) Co mam teraz jest:

public class RazoEngineExample 
    { 
     private static HttpRequestMessage _request; 
     static void Main(string[] args) 
     { 
      var viewParser = new RazorViewParser(baseTemplateType: typeof(WebApiContrib.Formatting.Razor.HtmlTemplateBase<>)); 
      var formatter = new RazorViewFormatter(viewParser: viewParser); 
      var config = new HttpConfiguration(); 
      config.Formatters.Add(formatter); 

      _request = new HttpRequestMessage(); 
      _request.SetConfiguration(config); 
      _request.RegisterForDispose(config); 

      var output = renderView(); 

      Console.WriteLine(output.Result); 

      _request.Dispose(); 
      _request = null; 
     } 

     private static async Task<string> renderView() 
     { 
      var cts = new CancellationTokenSource(); 
      var view = new ViewResult(_request, "view", new SampleModel() { Prop1 = "p1", Prop2 = "p2", Prop3 = new List<string> { "pe1", "pe2", "pe3" } }); 

      var response = await view.ExecuteAsync(cts.Token); 
      var output = await response.Content.ReadAsStringAsync(); 
      return output; 
     } 
    } 

jest kompilacji porządku i działa nawet (jeśli usunąć częściowego renderowania z tego punktu widzenia), jeśli mogę użyć częściowy widok dostaję taki błąd :

[ArgumentNullException] value cannot be null. parameter name: view

Inną rzeczą (ale definietly mniej ważne) to konsola wiadomość napisana przez razorengine:

RazorEngine: We can't cleanup temp files if you use RazorEngine on the default A ppdomain. Create a new AppDomain and use RazorEngine from there. Read the quickstart or https://github.com/Antaris/RazorEngine/issues/244 for det ails! You can ignore this and all following 'Please clean ... manually' messages if yo u are using DisableTempFileLocking, which is not recommended. Please clean 'C:\Users[user_account]\AppData\Local\Temp\RazorEngine_qeouaznq. ett' manually!

Sprawdziłem - i nie są uprawnienia do odczytu/zapisu (w tym folderze) prawidłowo ustawiony.

Proszę o pomoc !!! Jestem bardzo blisko :)

+0

Nie ma pojęcia? Ktoś? –

Odpowiedz

5

Tak, to jest wszystko możliwe. Podobne pytania zostały zadane wcześniej:

Spójrz na to answer.

To one wskazuje na powyższą odpowiedź.

Ten project również wygląda obiecująco, używa Razor z OWIN.

może nie być w stanie stosować @Html, @RenderBody i @RenderSection z pakietu Microsoft.AspNet.WebPages bez uzależnienia od System.Web.

From what i can tell, everything (excluding "automatic" files handling) is possible to achieve using RazorEngine project. But maybe even files handling (exactly the same as in MVC - searching for templates in Views and Subdirectories of Views) is available in this engine ? Or is it something i must write by myself ? Or maybe some other plugin gives me all this features ?

Istnieje razor media type formatter for webapi. Udostępnia interfejs IViewLocator jako część jego interfejsu, a jego domyślna implementacja wydaje się wykorzystywać wspomniane konwencje dotyczące lokalizacji plików. Możesz rozwinąć ten projekt, aby osiągnąć swoje cele.

+0

Anish - przejrzałem wszystkie linki dołączone do Twojej odpowiedzi. Nie ma nic, co mogę oznaczyć jako "pełne rozwiązanie". Napisałeś: "Istnieją oczywiście różne metody implementacji w zależności od Twoich potrzeb" -> Bardzo jasno określiłem moje potrzeby. Chcę brzytwa MVC (użyteczność jest taka sama jak w aplikacji MVC. W rzeczywistości widoki z aplikacji MVC byłyby po prostu skopiowane do tej biblioteki klasy) W tej bibliotece klasowej mogę odwoływać się do wszystkiego (w tym wspomnianego System.Web) –

+0

@PiotrFilipowicz Mam zaktualizowałem moją odpowiedź i dodałem link, który może ci pomóc. –

+0

dzięki za wskazówkę. Mimo to wciąż nie jest kompletny i "jedno kliknięcie" rozwiązanie. Po skopiowaniu części kodu z testów jednostkowych (dostępnych na stronie github), która renderuje ciąg z widoku - nadal otrzymuję: "Nazwa" HTML "nie istnieje w bieżącym kontekście" Wygenerowany kod źródłowy dla tego widoku ma tylko proste zastosowanie (system, generic collection itp.) A więc, to dość oczywiste, że nie wiedziałoby, czym jest "html".Nawet jeśli dodaję właściwe użycie (i właściwe odniesienie), to nie wiedziałoby o html (jak to jest HtmlHelper) Moje potrzeby ("brak zmian w wymaganych widokach") nie są spełnione –

Powiązane problemy