URL中的ASP.NET MVC冒号

问题描述:

我见过IIS让冒号进入URL有问题。我还看到了其他人提供的建议hereURL中的ASP.NET MVC冒号

随着网站我的工作,我希望能够通过电影,书籍等的标题,进入我的网址,包括结肠癌,像这样:

mysite.com/Movie/Bob:The Return 

这会被消耗掉例如,我的MovieController,作为一个字符串,并在线下使用。

我意识到冒号并不理想。有没有人有任何其他建议?虽然现在差,但我正在从所有冒号(:)查找并替换另一个字符,然后在我想要在控制器端使用它时进行反向替换。

+0

你为什么要用冒号?你发现这个工程在IIS以外的服务器上工作吗?我希望冒号甚至不允许指定端口号,因为它会使解析协议变得更简单。使用连字符,下划线或其他字符。或者让它成为另一个关卡,比如`mysite.com/Movie/Bob/The + Return`。 – 2011-01-14 18:58:25

+0

执行`mysite.com/Movie/Bob/The + Return`的问题就是搞清如何拍摄电影标题(“Bob:The Return”)并知道“嘿,标题中有一个冒号。我需要妥善地将它们放在一起。“ – 2011-01-14 22:33:07

+0

也许我应该传入一个既有标题又有slu class的类,而不仅仅是一个字符串的电影标题? – 2011-01-14 22:34:58

考虑URL encoding and decoding你的电影片名。

你想最终foo.com/bar/Bob%58The%20Return

作为替代方案,可以考虑利用的HTML helper to remove URL unfriendly characters in URLs(方法是URLFriendly())。冒号和占位符(例如破折号)之间的SEO优势可能会忽略不计。

冒号是根据RFC 3986的URI中的保留和无效字符。所以不要做违反规范的事情。您需要对其进行网址编码或使用其他字符。这里有一个nice blog post你可以看看。

+0

它说它无效?我解释错了吗? pchar = unreserved/pct-encoded/sub-delims /“:”/“@” – darkangel 2012-05-21 09:08:53

最简单的方法是使用System.Web.HttpUtility.UrlEncode建立网址 和System.Web.HttpUtility.UrlDecode时解释回来的结果时,()。如果不首先对值进行编码,则还会遇到空格字符问题。

你的方法最大的担忧之一是电影名称并不总是唯一的(例如“意大利工作”)。还有其他回肠字符(例如括号等)。

这可能是一个好主意,使用URL中的ID号码来定位数据库中的电影。你仍然可以在你的url中包含一个url友好的电影名称副本,但是你不需要担心回到原来的标题,其中包含所有非法字符。

一个很好的例子就是此页面的网址。你可以看到,除去页面的标题仍然有效:

ASP.NET MVC Colon in URL

ASP.NET MVC Colon in URL

我加入这我的web.config解决这个问题:

<httpRuntime requestPathInvalidCharacters=""/> 

这必须是system.web节内。

默认值为:

<httpRuntime requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,:,\,?"/> 

所以只能作出结肠例外它会成为

<httpRuntime requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,\,?"/> 

更多详情:http://msdn.microsoft.com/en-us/library/system.web.configuration.httpruntimesection.requestpathinvalidcharacters.aspx

对于我明白冒号作为URL中的未编码字符可以接受。我不知道他们为什么将它添加到requestPathInvalidCharacters的默认值。