2011-12-12 43 views
2

我正在寫一個MVC3網站,它使用tinymce作爲所見即所得的文本編輯器。我通過使用jQuery的AJAX調用來保存文本。我已經找到了查詢不發送,如果我的數據包括HTML,所以我需要做到這一點:使用MVC3的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的最佳方式是什麼,以輸入的形式存儲它,然後將其返回給客戶端進行顯示?

+0

似乎我不能提供8個小時我自己的問題的答案。答案是HttpUtility.UrlDecode – cgraus

+0

爲什麼Html.Raw()更好? – gdoron

回答

2

我已經找到了查詢不發送,如果我的數據包括HTML

不,你發現不對勁了。查詢已發送,但服務器拒絕它,因爲它包含危險字符。基本上它會在它達到你的控制器動作之前拋出一個異常。在ASP.NET MVC 3中,有幾種可能性來避免這種情況。

第一個是裝飾將接收HTML與[AllowHtml]屬性您的視圖模型屬性(建議):

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) 
{ 
    ... 
} 
1

我不確定HtmlDecode爲什麼不能滿足您的需求,但我確實有其他方法。 您可以允許通過將以下屬性控制器上

[ValidateInput(假)]

在.NET 4中,你可能還需要

<httpRuntime requestValidationMode="2.0" /> 

在Web上發佈的HTML數據.config

當然,您需要自己處理惡意輸入的可能性。


我想檢查的另一種可能性 - 你如何輸出你的html? 在剃鬚刀中,您需要使用@ Html.Raw(mystring),否則您的字符串會自動轉義。

+0

「在.net 4中你可能還需要在你的web.config中」需要什麼?! – gdoron

+0

嘿 - 忘記標記爲代碼,好趕上 –

0

如果你不想讓你的文本被編碼,你可以使用Raw擴展方法;

@Html.Raw("<p>this is a test</p>"); 
1

我在webmatrix中看到過與剃鬚刀引擎類似的問題。該帖子似乎掛起,因爲請求操作導致「潛在危險的內容錯誤」。

我的部分解決方案是使用Request.Unvalidated().Form["form_name"]來檢索包含tinymce表單數據的字符串。

然後我重新編碼並將其存儲在我的數據庫中。不幸的是,剃鬚刀引擎使用與JQuery不同的編碼,所以我無法將它解碼爲我的Ajax面板。