2011-12-12 87 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面板。