Bagaimana cara mengeluarkan html mentah saat menggunakan RazorEngine (BUKAN dari MVC)


105

Saya mencoba membuat email dengan konten HTML. konten ini sudah melalui sanitasi jadi saya tidak khawatir tentang itu, namun ketika saya menelepon:

Razor.Parse(template, model);

pada template Razor berikut:

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

email yang dikeluarkan adalah HTMl dikodekan, tapi saya membutuhkannya diterjemahkan. Bagaimana saya bisa melakukannya?


Saya menjawab ini, tetapi dihapus sebagai jawaban duplikat karena saya menjawabnya di sini: stackoverflow.com/questions/23603593/… ... jawaban ini berfungsi untuk MVC dan RazorEngine.
Brian Rice

Jawaban:


181

RazorEngine, seperti MVC Razor View Engine, akan secara otomatis menyandikan nilai yang ditulis ke template. Untuk menyiasati ini, kami telah memperkenalkan antarmuka yang dipanggil IEncodedString, dengan implementasi default adalah HtmlEncodedStringdan RawString.

Untuk menggunakan yang terakhir, cukup lakukan panggilan ke Rawmetode bawaan dari TemplateBase:

@Raw(Model.EmailContent)

4
@Matthew Maaf untuk menghidupkan kembali, tetapi meskipun ini dikompilasi, itu tidak terlihat cantik di Editor VS HTML, ia tidak akan mengenali Model atau Raw lagi. Ada solusi?
Jeff

5
@Jeff Saya berpikir pendekatan yang tepat adalah untuk RazorEngine untuk mengekspos kelas statis Html.cs yang memiliki metode statis. Raw sehingga akan memproses panggilan standar ke Html.Raw yang dapat digunakan untuk mendapatkan penyorotan sintaks yang benar di VS Razor editor.
Tod Thomson

8
@Manfred @Raw () berfungsi dengan baik di RazorEngine (bukan ASP.NET MVC's Razor;))
Jeff

Ingin melihat ini diselesaikan juga. Hal ini menyebabkan seluruh proyek tidak dapat dibangun dengan MvcBuildViews diaktifkan ...
guidupuy

2
"HtmlEncodedString" tidak berfungsi! Sebagai gantinya gunakan: RawString. Lihat contoh yang berhasil! public RazorEngine.Text.IEncodedString GetMarcaFinalDocumento () {kembalikan RazorEngine.Text.RawString baru ("<div> Hai! </div>");}
Charles


3

Jika Anda memiliki kelas dasar khusus untuk template Anda, Anda dapat mengkodekan Writemetode untuk berperilaku mirip dengan template MVC normal: jika nilai keluarannya IHtmlStringtidak boleh mengenkodenya.

Inilah kode yang saya gunakan di TemplateBasekelas saya :

// 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

Saya menggunakan RazorEngine 3.8.2 dan @Raw(Model.Content)bekerja dengan baik untuk saya.



-1

Saya menemukan semua ini berhasil dengan saya.

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


  @MvcHtmlString.Create(res)

  @Html.Raw(res)

4
Anda menggunakan pustaka MVC yang tidak tersedia dari mesin silet, jadi ini bukan jawaban untuk pertanyaan.
oligofren
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.