繁体   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