[英]HTML encoding and decoding using MVC3
我正在編寫一個MVC3網站,該網站使用tinymce作為WYSIWYG文本編輯器。 我使用jQuery通過AJAX調用保存了該文本。 我發現如果我的數據包含HTML,則不會發送查詢,因此我需要這樣做:
var postData = {
couponId: couponId,
coupon: escape(coupon),
imagePath: image,
imageAlignment: imageAlignment
};
$.post('@(Url.Action("SaveCoupon"))', postData, function (data) {
為了使我的數據傳遞到服務器。 這變成
<p>this is a test</p>
進入
%3Cp%3Ethis%20is%20a%20test%3C/p%3E
我一直在嘗試找出如何將其轉換回去。 HtmlString,HtmlHelper和HttpUtility類只是逐字返回它,我以為HttpUtility.HtmlDecode是我確定需要的東西,但是它根本不能滿足我的需求。 我需要將其存儲為已解碼的HTML到數據庫中,所以我不能只在客戶端將其重新編碼(盡管我擔心我也無法使用AJAX將其發送回去,甚至還有那么遠)。 通過AJAX調用傳輸HTML,以輸入形式存儲HTML並將其返回給客戶端進行顯示的最佳方法是什么?
如果我的數據包含HTML,我發現查詢未發送
不,您發現錯了。 發送查詢,但服務器拒絕它,因為它包含危險字符。 基本上,它會在到達控制器操作之前引發異常。 在ASP.NET MVC 3中,有兩種方法可以避免這種情況。
第一個是裝飾您的視圖模型屬性,該屬性將接收帶有[AllowHtml]
屬性的HTML(推薦):
public class CouponViewModel
{
public int CouponId { get; set; }
[AllowHtml]
public string Coupon { get; set; }
public string ImagePath { get; set; }
public string ImageAlignementh { get; set; }
}
這是您的控制器操作將采取的參數:
[HttpPost]
public ActionResult SaveCoupon(CouponViewModel model)
{
...
}
現在,在發送AJAX請求時,請勿進行任何轉義或其他操作。 jQuery會適當地對您的參數進行url編碼:
var postData = {
couponId: couponId,
coupon: coupon,
imagePath: image,
imageAlignment: imageAlignment
};
$.post('@Url.Action("SaveCoupon")', postData, function (data) {
...
});
另一種可能性是用[ValidateInput]
屬性裝飾整個動作,這將禁用整個請求的請求驗證(不推薦):
[HttpPost]
[ValidateInput(false)]
public ActionResult SaveCoupon(CouponViewModel model)
{
...
}
我不完全確定為什么HtmlDecode不能滿足您的需求,但是我確實有另一種方法。 您可以通過將以下屬性放在控制器上來允許html數據發布
[ValidateInput(假)]
在.Net 4中,您可能還需要
<httpRuntime requestValidationMode="2.0" />
在您的web.config中
當然,您將需要自行處理惡意輸入的可能性。
我想檢查的另一種可能性-您如何輸出html? 在剃須刀中,您將需要使用@ Html.Raw(mystring),否則您的字符串將再次自動轉義。
我在webmatrix中看到了剃刀引擎的類似問題。 由於請求操作導致“潛在危險的內容錯誤”,因此該帖子似乎掛起。
我的部分解決方案是使用Request.Unvalidated().Form["form_name"]
檢索包含tinymce表單數據的字符串。
然后,我將其重新編碼並存儲在數據庫中。 不幸的是,剃刀引擎使用的編碼與JQuery使用的編碼不同,因此我還無法為Ajax面板取消編碼。
如果您不希望對文本進行編碼,則可以使用Raw擴展方法。
@Html.Raw("<p>this is a test</p>");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.