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