RazorEngine kullanırken (MVC'den DEĞİL) ham html çıktısını nasıl çıkarırım


105

HTML içerikli e-postalar oluşturmaya çalışıyorum. bu içerik halihazırda temizlik işleminden geçti, bu yüzden bu konuda endişelenmiyorum, ancak aradığımda:

Razor.Parse(template, model);

aşağıdaki Razor şablonunda:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
    <body>
        @(new System.Web.HtmlString(Model.EmailContent))
    </body>
</html>

çıktısı alınan e-posta HTMl olarak kodlanmış, ancak kodunun çözülmesi gerekiyor. Bunu nasıl başarabilirim?


Bunu yanıtladım, ancak yinelenen yanıt olarak silindi çünkü burada yanıtladım: stackoverflow.com/questions/23603593/… ... bu yanıt hem MVC hem de RazorEngine için çalışıyor.
Brian Rice

Yanıtlar:


181

RazorEngine, MVC'nin Razor View Engine gibi, şablona yazılan değerleri otomatik olarak kodlayacaktır. Bunu aşmak için IEncodedString, varsayılan uygulamaların HtmlEncodedStringve olduğu bir arabirim sunuyoruz RawString.

İkincisini kullanmak için, aşağıdakilerin dahili Rawyöntemine bir çağrı yapmanız yeterlidir TemplateBase:

@Raw(Model.EmailContent)

4
@Matthew Canlandırdığım için üzgünüm, ancak bu derlense de, VS HTML Düzenleyicide hoş görünmüyor, artık Model veya Raw'u tanımıyor. Herhangi bir geçici çözüm var mı?
Jeff

5
@Jeff Doğru yaklaşımın RazorEngine'in statik bir metoda sahip statik bir sınıf Html.cs'yi ortaya çıkarması olduğunu düşünüyorum.Raw, böylece VS Razor'da doğru sözdizimi vurgulamasını elde etmek için kullanılabilecek Html.Raw'a standart çağrıları işleyecek editör.
Tod Thomson

8
@Manfred @Raw () RazorEngine'de iyi çalışıyor (ASP.NET MVC'nin Razor'u değil;))
Jeff

Bunun da çözüldüğünü görmek isterim. Bu, tüm projenin MvcBuildViews etkinken oluşturulmamasına neden oluyor ...
guidupuy

2
"HtmlEncodedString" çalışmıyor! Bunun yerine şunu kullanın: RawString. İşe yarayan bir örneğe bakın! public RazorEngine.Text.IEncodedString GetMarcaFinalDocumento () {return new RazorEngine.Text.RawString ("<div> Merhaba! </div>");}
Charles


3

Şablonlarınız için özel bir temel sınıfınız varsa, Writeyöntemi normal MVC şablonuna benzer şekilde davranacak şekilde IHtmlStringkodlayabilirsiniz : eğer çıktı değeri bu ise onu kodlamamalıdır.

Sınıfımda kullandığım kod şu TemplateBase:

// Writes the results of expressions like: "@foo.Bar"
public virtual void Write(object value)
{
    if (value is IHtmlString)
        WriteLiteral(value);
    else
        WriteLiteral(AntiXssEncoder.HtmlEncode(value.ToString(), false));
}

// Writes literals like markup: "<p>Foo</p>"
public virtual void WriteLiteral(object value)
{
    Buffer.Append(value);
}

3

RazorEngine 3.8.2 kullanıyorum ve @Raw(Model.Content)benim için mükemmel çalışıyor.



-1

Bunların hepsinin benimle çalıştığını buldum.

@{var myHtmlString = new HtmlString(res);}
@myHtmlString


  @MvcHtmlString.Create(res)

  @Html.Raw(res)

4
Jilet motorunda bulunmayan MVC kütüphanesini kullanıyorsunuz, bu yüzden bu sorunun cevabı değil.
oligofren
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.