代码之家  ›  专栏  ›  技术社区  ›  Cheeso

如何将包含冒号的GET请求发送到ASP.NET MVC2控制器?

  •  4
  • Cheeso  · 技术社区  · 15 年前

    这很好用:

    GET /mvc/Movies/TitleIncludes/Lara%20Croft
    

    当我提交包含冒号的请求时,如下所示:

    GET /mvc/Movies/TitleIncludes/Lara%20Croft:%20Tomb
    

    …它会产生400个错误。错误表明 ASP.NET在URL中检测到无效字符。

    如果我尝试URL转义,请求如下:

    GET /mvc/Movies/TitleIncludes/Lara%20Croft%3A%20Tomb
    

    …这也给了我400个错误。

    如果我用替换结肠:

    GET /mvc/Movies/TitleIncludes/Lara%20Croft|%20Tomb
    

    …这也被重新定义为非法,这次有500个错误。信息: 路径中有非法字符。

    导致相同错误的URL转义。


    我真的,真的不想使用querystring参数。


    相关:
    Sending URLs/paths to ASP.NET MVC controller actions

    3 回复  |  直到 12 年前
        1
  •  3
  •   Cheeso    15 年前

    我发现URL编码不起作用,但自定义编码起作用。
    我猜aspnet mvc使用文件系统进行解析和路由,因为URL中的一个字符在文件系统中是非法的,会导致500或400错误。

    所以我做的是用unicode替换colons 在javascript端的字符,然后在操作中进行转换。这样地:

    浏览器:

    function myEscape(s){
        return s.replace(':', '%C2%A1').trim();
    }
    

    在操作中,在使用参数之前调用此转换:

    private string MyCustomUnescape(string arg)
    {
        return arg.Replace("¡", ":");
    }
    

    同样的方法也适用于斜杠-只需选择不同的Unicode字符。当然,如果字符串参数本身是Unicode,那么就必须为“编码的”表单使用不可打印的字符。

        2
  •  1
  •   em70    15 年前

    如果SEO不是一个问题,您可以使用base64,然后进行urlencode。在第一步之后,您将拥有的每个字符都将很容易编码。在.NET中解码和在system.web.httputility和system.convert中使用助手一样简单。

        3
  •  0
  •   Community CDub    8 年前

    类似的回答如下: https://stackoverflow.com/a/12037000/134761

    对参数使用问号和与号,而URL对参数进行编码。

    示例:get/mvc/movies/titleincludes?标题=Lara%20croft%3a%20Cumble

    我也同意将内容编码到URL中是很好的,但是可能有一个很好的理由不这样做。