2009-05-25 25 views
7

Mamy kilka encji domeny, które powinny być renderowane do formatu html, który pokazuje ich szczegóły w wyskakującym okienku.Renderowanie obiektów w języku C# na html

byłbym zadowolony, aby zrobić coś takiego:

Product product = new Product(...); 
product.ToHtml(); // or: HtmlRenderer.Render(Product); 

ale moim głównym problemem jest to, jak to zrobić rzeczy z tyłu. Mam 3 różne odpowiedzi:

1. Renderowanie za pomocą kodu:

mogę po prostu napisać kod dla renderowania HTML wewnątrz metody toHTML (C#) - problem jest to, że jest zbyt statyczne. jeśli chcesz nieco przesunąć nagłówek do środka, powinieneś zmienić kod. co więcej, bardzo trudno jest przeczytać wcięcie HTML w C#.

2. Korzystanie XSL:

XSL Pliki można łatwo zarządzać za pomocą szablonu HTML i XSLT można przekształcić plik XML we właściwym miejscu dokumentów. parser już napisany przez kogoś innego (po prostu trzeba się nauczyć składni) ** w tym celu będziemy potrzebować, aby każdy obiekt mógł przekształcić do postaci Xml. i jeśli obiekt się zmienił -> Xml zostanie zmieniony -> xslt również musi zostać zmieniony ** to również daje mi możliwość wcięcia html w prosty sposób, na przykład: dodawanie możliwości css i \ lub zmienianie projektu html

3. pomocą innego silnika szablon:

Napisz własną C# -> HTML szablonu silnika tak będzie odczytać szablon z pliku (* .template) i wstawić odpowiednią nieruchomość we właściwym miejscu szablon za pomocą refleksji. ** w tym rozwiązaniu mamy wiele problemów, które możemy wymyślić, na przykład: jak powinna wyglądać składnia? czy to jest ok? % Nazwa%% Opis% i jak możemy obsługiwać tablice? ** może możemy użyć istniejącego silnika (Brail lub T4-Templating)?

Co wolisz? czy znasz dobry silnik? na razie wolę drugie rozwiązanie, ale będzie bardzo wolno.

dzięki

Odpowiedz

3

Nie mogę się zgodzić z Johnem Feminella. Integracja renderowania html bezpośrednio z twoimi domenami to okropne zanieczyszczenie Twojej domeny z całkowicie arbitralnym i zewnętrznym problemem. Tak jak powiedział John, sprawisz, że twoje istoty będą bardzo kruche, łamiąc obie te kluczowe zasady: oddzielenie obaw i pojedyncza odpowiedzialność.

Od wyborów dałeś, nr 3 znajduje się najbliżej właściwy sposób to zrobić. Nie musisz pisać własnego silnika szablonów. W sieci dostępnych jest wiele darmowych i gotowych szablonów, które wykonają pracę bardziej niż odpowiednio (NVelocity, StringTemplate, Brail itp.).

Zachowaj rendering tam, gdzie należy ... w prezentacji/widoku i nie zanieczyszczaj swojej domeny problemami o wyższym poziomie.

3

Jest to praca z widoku, a nie swoimi kontrolerami lub modeli. Jak podejrzewasz, użycie metody (1) spowoduje, że twoje zmiany będą bardzo kruche. Zamiast tego napisz fragment widoku dla każdego sposobu, w jaki chcesz renderować daną domenę. Następnie po prostu przyciągnij odpowiednie widoki, aby zbudować swoją ostatnią stronę.

2

Szczerze wolę metodę A. Kod HTML jest już standardem, więc nie powinieneś zbytnio się bić za pomocą formatów pośrednich, takich jak XML (przez XSL - metoda 2) lub format niestandardowy (metoda 3).

Podczas pisania w/dla ASP.NET MVC można jednak zbudować .ASCX (kontrola użytkownika), która zaakceptowałaby obiekt twojego typu i wyrenderował odpowiedni HTML. I nie dostaniesz nieprzyjemnego wcięcia C# i żadnego wyróżnienia ani autouzupełniania.

Można również napisać wiele widoków użytkownika, aby pomieścić różne scenariusze dla jednego typu obiektu.

+0

ja nie pracuję w zespole internetowej, jestem renderowania obiektów-as-html i wysłać je do kogoś innego - który można wykorzystać to w WPF \ palma \ stronie internetowej lub innej technologii, więc myślę, że ascx nie jest dla mnie dobry. – rabashani

+0

W takim przypadku możesz serializować go w formacie JSON i przesłać go innym użytkownikom, aby go użyć. – shahkalpesh

+0

nadal nie jest wystarczająco dobry Chcę, aby wszyscy mieli ten sam interfejs użytkownika. nie obsługuje logiki renderowania samodzielnie. – rabashani

0

Czy istnieje powód nie chcesz, aby utworzyć plik .ascx sterowania zwyczaj, że trwa podmioty domeny obiekt jako argument, a następnie można zrobić GUI w dowolny sposób. W ten sposób możesz dynamicznie dodawać kontrolki do strony i po prostu ustawić właściwość, aby je wypełnić.

Edytuj 1: Po prostu przenieś kontrolę do HTMLTextWriter zamiast umieszczać go na stronie.

 StringBuilder outString = new StringBuilder(); 
     StringWriter outWriter = new StringWriter(outString); 
     HtmlTextWriter htmlText = new HtmlTextWriter(outWriter); 
     System.Web.UI.WebControls.Label lbl1 = new System.Web.UI.WebControls.Label(); 
     lbl1.Text = "This is just a test!"; 
     lbl1.ToolTip = "Really"; 
     lbl1.RenderControl(htmlText); 
     ViewData["Output"] = outString.ToString(); 

Wyjście

<span title="Really">This is just a test!</span> 

oczywiście użyć niestandardowego formantu zamiast wbudowanego w kontroli, ale to było szybkie i łatwe demo.

+0

Nie pracuję w zespole internetowym, renderuję obiekty-as-html i wysyłam je do każdego innego - kto można go użyć w witrynie wpf \ palm \ web-site lub innej technologii, więc domyślam się, że ascx nie jest dla mnie dobry – rabashani

+0

Ale nadal możesz wyrenderować kontrolę nad html do zapisu tekstu i przekazać tę wartość. W ten sposób możesz nadal projektować i utrzymywać ascx dla wygody i prostoty w stosunku do pisania własnego silnika XsL lub szablonu. – benjamin

+0

dodał kod do mojej odpowiedzi, aby pokazać, jak działa ascx. – benjamin

5

Raz był potrzebę poprawy zbiór dowolnego typu do tabeli HTML. Stworzyłem metodę rozszerzenia na IEnumerable <T>, która miała przeciążenia dla css i tym podobne. Można zobaczyć mojego blogu o tym tutaj:

http://crazorsharp.blogspot.com/2009/03/cool-ienumberable-extension-method_25.html

wykorzystuje odbicia, aby uzyskać wszystkie właściwości obiektu i renderuje ładny mały stolik. Sprawdź, czy to zadziała.

[System.Runtime.CompilerServices.Extension()] 
public string ToHtmlTable<T>(IEnumerable<T> list, string propertiesToIncludeAsColumns = "") 
{ 
    return ToHtmlTable(list, string.Empty, string.Empty, string.Empty, string.Empty, propertiesToIncludeAsColumns); 
} 

[System.Runtime.CompilerServices.Extension()] 
public string ToHtmlTable<T>(IEnumerable<T> list, string tableSyle, string headerStyle, string rowStyle, string alternateRowStyle, string propertiesToIncludeAsColumns = "") 
{ 
    dynamic result = new StringBuilder(); 
    if (String.IsNullOrEmpty(tableSyle)) { 
     result.Append("<table id=\"" + typeof(T).Name + "Table\">"); 
    } else { 
     result.Append((Convert.ToString("<table id=\"" + typeof(T).Name + "Table\" class=\"") + tableSyle) + "\">"); 
    } 

    dynamic propertyArray = typeof(T).GetProperties(); 

    foreach (object prop in propertyArray) { 
     if (string.IsNullOrEmpty(propertiesToIncludeAsColumns) || propertiesToIncludeAsColumns.Contains(prop.Name + ",")) { 
     if (String.IsNullOrEmpty(headerStyle)) { 
      result.AppendFormat("<th>{0}</th>", prop.Name); 
     } else { 
      result.AppendFormat("<th class=\"{0}\">{1}</th>", headerStyle, prop.Name); 
     } 
     } 
    } 

    for (int i = 0; i <= list.Count() - 1; i++) { 
     if (!String.IsNullOrEmpty(rowStyle) && !String.IsNullOrEmpty(alternateRowStyle)) { 
      result.AppendFormat("<tr class=\"{0}\">", i % 2 == 0 ? rowStyle : alternateRowStyle); 

     } else { 
      result.AppendFormat("<tr>"); 
     } 
     foreach (object prop in propertyArray) { 
      if (string.IsNullOrEmpty(propertiesToIncludeAsColumns) || propertiesToIncludeAsColumns.Contains(prop.Name + ",")) { 
       object value = prop.GetValue(list.ElementAt(i), null); 
       result.AppendFormat("<td>{0}</td>", value ?? String.Empty); 
      } 
     } 
     result.AppendLine("</tr>"); 
    } 

    result.Append("</table>"); 

    return result.ToString(); 
} 
0

Osobiście, chciałbym połączyć dwa i trzy metody: wystarczy stworzyć ogólny dokument XML przy użyciu odbicia, powiedzieć:

<object type="xxxx"> 
    <property name="ttt" value="vvv"/> 
    ... 
</object> 

i użyć arkusza stylów XSTL stworzyć rzeczywisty HTML z tego.

1

Po trochę badań zrobiłem własną funkcję do konwersji dowolnego toHtmlString obiektu.

VB Net Kod:

Public Function ToHtmlString(ByVal fObj As Object) As String 
    Dim pType = fObj.GetType() 
    Dim props As IList(Of PropertyInfo) = pType.GetProperties() 
    Dim value As Object = Nothing 
    Dim htmlString As String = "<html><body><form>" 

    For Each p In props 
     value = p.GetValue(fObj, Nothing) 
     If value <> Nothing Then 
      htmlString += String.Format("<input type=""hidden"" name=""{0}"" id=""{0}"" value=""{1}""/>", p.Name, value) 
     End If 
    Next 

    htmlString += "</form></body></html>" 
    Return htmlString.ToString() 

będzie uzyskać nazwę właściwości i wartości z określonego przedmiotu. można manipulować html w oparciu o

Powiązane problemy