簡體   English   中英

使用MVC3進行HTML編碼和解碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM