2013-05-30 52 views
1

警告:我有一个MVC站点作为.Net WebForms站点中的一个区域。我提前解释说,在它揭示我的问题的情况下。MVC Double Encoding MvcHtmlString

现在我遇到的问题是我路由的值可能包含特殊字符,如apostrophe(单引号)。如果我不对其值进行编码,但是当使用未编码的单引号作为过滤器时,我的Kendo MVC Grid会创建无效模板。

http://{base}/{area}/{controller}/{view}?customerName=Justin's%20Instance - Throws Invalid Template Error 

http://{base}/{area}/{controller}/{view}?customerName=Justin's%20Instance - No Error 

所以我想最简单的解决办法是我的查询参数传递给它的路径值之前正确编码。这导致了双重编码情况。然后我发现了大约MvcHtmlString.Create这是专门设计告诉路由系统不要重新编码字符串值。但是,它仍然是双重编码。

var customerNameEncoded = MvcHtmlString.Create(HttpUtility.HtmlEncode(model.Name)); 

var routeResult = RedirectToAction("ManageCustomer", new { customerName = customerNameEncoded }); 

return routeResult; 

这是生成的网址:

http://{base/{area}/{controller}/{view}?customerName=Justin%26%2339%3Bs%20Instance 

正如你可以看到'再次被编码。这是抛出以下错误。

> System.Web.HttpRequestValidationException A potentially dangerous 
> Request.QueryString value was detected from the client 
> (customerName="Justin's Instance"). 

web.config为MVC地区的以下标签:validateRequest="false"

web.config对整个网站有以下几点:httpRuntime requestValidationMode="2.0"

任何想法,为什么这个字符串被双重编码,并如何阻止它这样做?

+0

如果你使用的是MVC,你应该使用[ValidateInput(false)]来修饰你的函数....我正在看你所说的两个链接,一个抛出模板错误,另一个不。但是,它们看起来一样。这是故意的吗? –

回答

0

这里有两种不同类型的编码。 一个是HTML编码,它创建了那些& 39;转义序列。 其次是使用%20转义序列的URL编码。

我不知道Kendo MVC Grid是什么,我想我知道你的行为结果应该是什么。如果停止它返回你会看到URL内容之前Index方法试试这个代码

public ActionResult Index() 
    { 
     var customerNameEncoded = "Justin's Instance"; 
     var url = Url.Action("ManageCustomer", new { customerName = customerNameEncoded }); 
     return Redirect(url); 
    } 

    public ActionResult ManageCustomer(string customerName) 
    { 
     ViewBag.CustomerName = customerName; 
     return View(); 
    } 

"/Home/ManageCustomer?customerName=Justin%27s%20Instance" 

什么是正确编码的URL。

你也可以检查你得到什么作为客户名称中ManageCustomer动作,你会看到它的

"Justin's Instance" 

不要由你可以在浏览器的地址栏中看到困惑。有些浏览器(如Firefox)不显示的URL编码,并可能会显示类似“.../ManageCustomer?客户名称=贾斯汀的实例”

+0

浏览器实际上编码正确,但是Kendo Grid是最终的罪魁祸首。结束了一个错误的事情我的轮子旋转太久。感谢您的建议。 –

0

1)查询字符串参数是URL编码,而不是HTML编码。 (%符号,而不是&#实体)

2)配置设置validateRequestrequestValidationMode适用于ASP.Net Web窗体,而不是MVC。Bryan评论道,您必须将[ValidateInput(false)]属性添加到控制器方法中。