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?

KallDrexx
sumber
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)
Matthew Abbott
sumber
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
15

FYI saya memiliki garpu yang menyertakan sintaks @ Html.Raw (...) di sini:

https://github.com/Antaris/RazorEngine/pull/105

Tod Thomson
sumber
3
@ Html.Raw () tidak memerlukan konfigurasi dimuka. Solusi bagus.
MartinJH
Saya juga. Saya dapat membuat tag dan nilai HTML dalam Razor Code dan meneruskannya ke View dengan ViewData dan menampilkannya menggunakan @ Html.Ras (ViewData ["NextEvent"]
JustJohn
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);
}
Iravanchi
sumber
3

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

penasaran.netter
sumber
-1

Saya menemukan semua ini berhasil dengan saya.

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


  @MvcHtmlString.Create(res)

  @Html.Raw(res)
MuniR
sumber
4
Anda menggunakan pustaka MVC yang tidak tersedia dari mesin silet, jadi ini bukan jawaban untuk pertanyaan.
oligofren