2012-05-18 13 views
5

Mam aplikację C#/.NET, która obecnie używa StringBuilder do generowania wiadomości e-mail HTML.Jak dołączyć dokument HTML do aplikacji .NET z polami zmiennymi?

Nowy format wiadomości został opracowany i zawiera teraz więcej formatowania i CSS. Chciałbym uniknąć dołączania każdej linii pliku za pomocą StringBuilder, więc pomyślałem, że najlepiej jest dołączyć plik HTML jako zasób.

Jednak istnieje około 21 zmiennych w CSS i HTML, które muszę zmienić w locie. Moją pierwszą myślą było zastąpienie ich standardowymi obiektami zastępczymi String.Format ({0}, {1} itp.), Ale podczas przeglądania HTML walidacja narzeka na te.

Jestem raczej zaskoczony, jeśli chodzi o przechowywanie 200-liniowego pliku HTML i zmienianie jego części przed umieszczeniem go w wiadomości e-mail.

Przykład:

W CSS, muszę zmienić kolor niektórych elementów, takich jak to:

#header 
{ 
    background-color: {0}; 
} 

I w HTML, muszę zmienić struny i adresy URL, na przykład:

<img src="{1}" /> 
<span>{2}</span> 

wydaje tym HTML jako zasób w projekcie byłoby najlepsze, ale próbuje użyć String.Format z tego zasobu, niezależnie od tego czy będzie to działało, to słaba metoda becaus e wyżej wymienionych błędów walidacji.

Wszelkie sugestie?

+1

Dlaczego problem polega na tym, że sprawdzanie poprawności kończy się niepowodzeniem w "szablonie HTML" przed zastąpieniem symboli zastępczych? IMHO jedyną ważną rzeczą jest to, że sprawdza się poprawnie PO zastąpieniu symboli zastępczych pewną zawartością! – Yahia

+0

Potem musisz pamiętać, co znaczy co. I musisz zachować spójność argumentów. Użyj wymiennych tokenów, takich jak <% token_name%> i stwórz prostą metodę find-replace, aby zastąpić tokeny z jakiegoś słownika. –

+0

To pytanie jest jak róża w przepełnieniu stosu pełnym chwastów. Mam nadzieję, że dostanie odpowiedź. –

Odpowiedz

2

Zamiast używać {1} użyć nazwy np Table1HeaderImage, a następnie zamiast String.Format użyj String.Replace. Można mieć kolekcję thingies umieścić w thehtml wtedy, krótki pętlę, nawet dodatkowe atrybuty dla dostosowywania od wersji użytkowników itp

+0

Proste, ale skuteczne. – JYelton

+0

Moje drugie imię, również jego część. :) –

4

Myślę, że można spróbować t4 tamplate

T4 szablonu można zrobić nawet bardziej skomplikowane rzeczy jak

<table> 
<# for (int i = 1; i <= 10; i++) 
    { #> 
    <tr><td>Test name <#= i #> </td> 
     <td>Test value <#= i * i #> </td> </tr> 
<# } #> 
</table> 
0

Co mogę zrobić, to coś takiego:

StreamReader reader = new StreamReader(Server.MapPath("Email/email.html")); 
string email_html = reader.ReadToEnd(); 
reader.Close(); 

email_html = email_html.Replace("[link]", activation_link); 
+0

Zasadniczo to, co zrobiłem; dzieki za sugestie. – JYelton

+0

-1: że 'StreamReader' musi znajdować się w bloku' using'. –

0

Chciałbym użyć <%0%>, <%1%> itp. Zamiast {0}, {1} itd.

W czasie wykonywania byś:

  1. Wymień wszystkie { z {{ i } z }}
  2. Wymień wszystkie <% z { i %> z }
  3. String.Format()

Mogłabyś rób tak, jak zasugerował Val Bachtin, i używaj nazw zamiast liczb. Wtedy proces byłby po prostu:

  1. Wymień wszystkie <%name%> z dictionary["name"]
2

Można utworzyć wstępnie przetworzone T4 plik szablonu tekst. http://msdn.microsoft.com/en-us/library/ee844259 Jedną z ciekawych funkcji szablonów tekstowych T4 jest możliwość automatycznego generowania dowolnego rodzaju pliku tekstowego.

+0

+1, ale proszę podać przykład. –

Powiązane problemy