参数中包含斜杠的网址?

Ste*_*ger 63 asp.net-mvc asp.net-mvc-routing

题:

我正在创建一个wiki软件,基本上是维基百科/ mediawiki的克隆,但是在ASP.NET MVC中(MVC是重点,所以不建议我使用ScrewTurn).

现在我有一个问题:

我使用此路由映射来路由URL,如:http:
//en.wikipedia.org/wiki/ASP.NET

        routes.MapRoute(
            "Wiki", // Routenname
            //"{controller}/{action}/{id}", // URL mit Parametern
            "wiki/{id}", // URL mit Parametern
            new { controller = "Wiki", action = "dbLookup", id = UrlParameter.Optional } // Parameterstandardwerte
        );
Run Code Online (Sandbox Code Playgroud)

现在它刚刚发生在我身上,可能会出现像'AS/400'这样的标题:http:
//en.wikipedia.org/wiki/AS/400

在整体上,还有这个(标题'Slash'):http:
//en.wikipedia.org/wiki//

这一个:http:
//en.wikipedia.org/wiki//dev/null

总的来说,维基百科似乎有一个有趣的标题列表,如:http://en.wikipedia.org/wiki/Wikipedia : Articles_with_slashes_in_title

如何正确制作此路线的路线?

编辑:
类似于:
如果URL以/ Wiki /开头,如果它不以/ wiki/Edit /(但不是/ Wiki/Edit)开头,则将所有其余URL作为Id传递.

编辑:
嗯,只是另一个问题:我如何路由这个:http:
//en.wikipedia.org/wiki/C&A

维基百科可以......

编辑:
根据维基百科,由于与wikitext语法的冲突,在页面标题中永远不能使用以下字符(DISPLAYTITLE也不支持):

# < > [ ] | { }
Run Code Online (Sandbox Code Playgroud)

http://en.wikipedia.org/wiki/Wikipedia:Naming_conventions_(technical_restrictions)#Forbidden_​​characters

编辑:
允许*和&,放

<httpRuntime requestPathInvalidCharacters="" />
Run Code Online (Sandbox Code Playgroud)

到文件web.config中的<system.web>部分

(在此处找到:http://www.christophercrooker.com/use-any-characters-you-want-in-your-urls-with-aspnet-4-and-iis)

Dar*_*rov 92

您可以使用catchall路由捕获跟随wikiurl部分的所有内容到id令牌中:

routes.MapRoute(
    "Wiki",
    "wiki/{*id}",
     new { controller = "Wiki", action = "DbLookup", id = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)

现在,如果您有以下请求:/wiki/AS/400它将映射到Wiki控制器上的以下操作:

public ActionResult DbLookup(string id)
{
    // id will equal AS/400 here
    ...
}
Run Code Online (Sandbox Code Playgroud)

/wiki//我而言,我相信在此请求到达ASP.NET管道之前,您将从Web服务器收到400 Bad Request错误.您可以查看以下博文.

  • @Quandary,我不认为你可以免除一个笼罩规则.您可以尝试在我显示的那个之前定义另一个路径**,看起来像这个`wiki/Edit/{*id}`. (3认同)

Usm*_*man 17

Attribute Routingmvc我有同样的问题/在字符串abc/cdeHttpGet

        [Route("verifytoken/{*token}")]
        [AllowAnonymous]
        [HttpGet]
        public ActionResult VerifyToken(string token)
        {
          //logic here
        }
Run Code Online (Sandbox Code Playgroud)

所以你必须放置*因为在此之后它将被视为参数

  • @Usman如果你有另一条路线[Route("verifytoken/{token}/something")]怎么办?如果存在正斜杠,通配符是否会与该路由发生冲突?对于这个用例,还有其他方法可以做到这一点吗? (3认同)
  • 太棒了 这是最好,最简单的解决方案:) (2认同)
  • 这似乎适用于一次斜杠,但不适用于连续两次。有什么想法吗? (2认同)

小智 5

@Darin:嗯,这很明显,问题是:为什么?给出了控制器+动作+ id,它就像它将所有这些传递给路由器一样...... - Quandary 2011年6月13日17:38

Quandry - 也许你已经解决了这个问题,因为你的问题已经超过一年了,但是当你调用RedirectToAction时,你实际上是在向浏览器发送一个HTTP 302响应,这会导致浏览器向指定的动作发出GET请求.因此,你看到的无限循环.

请参阅:Controller.RedirectToAction方法