ASP.NET MVC Razor render tanpa pengkodean

250

Razor mengkodekan string secara default. Apakah ada sintaks khusus untuk rendering tanpa pengkodean?

SiberianGuy
sumber

Jawaban:

374

Karena ASP.NET MVC 3, Anda dapat menggunakan:

@Html.Raw(myString)
Lucas
sumber
8
Ini tidak sepenuhnya benar. Ya, Anda dapat memasukkan string mentah tetapi jika Anda memiliki "'<>etc...ini akan lolos. Cara yang benar adalah dengan menggunakan MvcHtmlString yang memungkinkan karakter "ilegal". Misalnya, jika Anda menyandikan data Json ... tanpa menyandi seluruh model
Daniel B. Chapman
4
Daniel, Html.Raw () "mengembalikan markup yang bukan HTML yang disandikan."
Lucas
1
Html.Raw () menyandikan tanda kutip ..."myAttr='hello';myInt=10"
Serge
4
Ini TIDAK menyandikan tanda kutip. Selain dokumentasi yang jelas menyatakan itu polos sebagai hari ( "Metode ini membungkus HTML markup menggunakan kelas IHtmlString, yang membuat unencoded HTML." ) Saya juga diuji ini dan kutipan tidak dikodekan.
James Wilkins
58
@(new HtmlString(myString))
Matthew Vines
sumber
31

Serta pendekatan @ Html.Raw (string) yang telah disebutkan, jika Anda menampilkan MvcHtmlString, itu tidak akan dikodekan. Ini bisa bermanfaat saat menambahkan ekstensi Anda sendiri ke HtmlHelper, atau ketika mengembalikan nilai dari model tampilan Anda yang Anda tahu mungkin mengandung html.

Misalnya, jika model tampilan Anda adalah:

public class SampleViewModel
{
  public string SampleString { get; set; }
  public MvcHtmlString SampleHtmlString { get; set; }
}

Untuk Core 1.0+ (dan MVC 5+) gunakan HtmlString

public class SampleViewModel
{
  public string SampleString { get; set; }
  public HtmlString SampleHtmlString { get; set; }
}

kemudian

<!-- this will be encoded -->
<div>@Model.SampleString</div>
<!-- this will not be encoded -->
<div>@Html.Raw(Model.SampleString)</div>
<!-- this will not be encoded either -->
<div>@Model.SampleHtmlString</div>
Jonathan Moffatt
sumber
10

Gunakan @Html.Raw()dengan hati-hati karena Anda dapat menyebabkan lebih banyak masalah dengan penyandian dan keamanan. Saya mengerti use case karena saya harus melakukan ini sendiri, tapi hati-hati ... Hanya menghindari semua teks yang masuk. Misalnya hanya menyimpan / mengonversi urutan karakter tertentu dan selalu menyandikan sisanya:

@Html.Raw(Html.Encode(myString).Replace("\n", "<br/>"))

Maka Anda memiliki ketenangan pikiran bahwa Anda belum membuat lubang keamanan potensial dan karakter khusus / asing ditampilkan dengan benar di semua browser.

Tony Wall
sumber
+1 Persis apa yang saya butuhkan! String masih perlu disandikan tetapi pengembalian baris harus html. Terima kasih!
Peter
@Html.Raw(Html.Encode(myString).Replace(Html.Encode("\n"), "<br/>"))untuk ASP.NET Core
kenjiuno
5

Dalam kasus ActionLink, umumnya menggunakan HttpUtility.Encode pada teks tautan. Dalam hal ini Anda dapat menggunakannya HttpUtility.HtmlDecode(myString) bekerja untuk saya ketika menggunakan HtmlActionLink untuk memecahkan kode string yang ingin saya sampaikan. misalnya:

  @Html.ActionLink(HttpUtility.HtmlDecode("myString","ActionName",..)

gutsy_guy
sumber
1

Anda juga dapat menggunakan metode WriteLiteral

Hamid Shahid
sumber
1

HTML RAW:

@Html.Raw(yourString)
Farbod
sumber