1

警告:我有一个 MVC 站点作为 .Net WebForms 站点中的一个区域。我会提前解释一下,因为它可以阐明我的问题。

现在我遇到的问题是我正在路由可能包含特殊字符(如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;

这是创建的 URL:

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.configMVC 区域具有以下标记:validateRequest="false"

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

关于为什么这个字符串被双重编码以及如何阻止它这样做的任何想法?

4

2 回答 2

0

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

2) 配置设置validateRequestrequestValidationMode应用于 ASP.Net WebForms,而不是 MVC。[ValidateInput(false)]正如 Bryan 评论的那样,您必须将属性添加到控制器方法中。

于 2013-06-02T11:05:23.273 回答
0

这里混合了两种不同类型的编码。一种是创建那些 &39; 的 HTML 编码。转义序列。其次是制作 %20 转义序列的 URL 编码。

我不知道 Kendo MVC Grid 是什么,我想我知道您的操作的结果应该是什么。试试这个代码

    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();
    }

如果您在 Index 方法返回之前停止它,您会看到 url 内容是

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

什么是正确编码的 URL。

您还可以在 ManageCustomer 操作中检查作为 customerName 获得的内容,您会看到它是

"Justin's Instance"

不要对您在浏览器地址栏中看到的内容感到困惑。某些浏览器(如 Firefox)不显示编码的 URL,可能会显示类似“.../ManageCustomer?customerName=Justin's Instance”的内容

于 2013-05-30T19:34:00.580 回答