2011-05-05 44 views
7

我有我的看法如下代码:如何网址,ASP .NET MVC编码参数

<%= Html.ActionLink(
      "View item", 
      "Index", 
      "Items", 
      new 
      { 
       itemName = Model.ItemName 
      }, 
      null) %> 

我当项目名称包含锐(#)的一个问题或百分号(%) 。

  • 当物品名称是"name#with#sharp#",控制器接收唯一的名称的第一部分,直到第一尖锐(仅接收"name")。

  • 当项目名称为"name%with%percent"时出现错误:HTTP错误400 - 错误的请求。

我不知道这是URL编码的问题,因为它与其他抵触的字符,如工作:

; 
= 
+ 
, 
~ 
[blank] 

你知道我怎么能解决这个问题?

在此先感谢。

+0

哪些网址正在生成?当我用'%'符号尝试你的例子时,我得到这个:'http:// localhost/AspNetMvc2/Items?itemName = name%25with%25percent',并且没有错误。另外,带'#'符号的例子产生这样的结果:'http:// localhost:55386/Items?itemName = name%23with%23sharp%23' – 2011-05-05 17:25:22

回答

11

我假设你有一个路线设置和您的网址看起来像这样:

http://localhost/Items/Index/name%25with%25percent - (这将炸毁)

与此相反:

http://localhost/Items/Index/?itemName=name%25with%25percent - (查询字符串是好的)

所以一个选项是从您的路由(在您的RouteCollection)中删除“itemName”属性,以便Html.ActionLink将使用itemName作为QueryString参数呈现Url。

正如@Priyank所说,问题是因为itemName是Url的一部分(不是QueryString参数),它包含非法字符。

+0

是的,你假设是正确的。所以使用%符号的唯一地方就是查询字符串。有没有其他方式可以在网址中使用%? – 2011-05-06 08:32:55

0

你应该能够使用你的视图的UrlHelper实例为你做这个。试试这个给人打预防针:

<%= Html.ActionLink( "View item", "Index", "Items", new { itemName = Url.Encode(Model.ItemName) }, null) %>

更新

测试后,似乎明确地编码像我一样,上面似乎是准确,将导致服务器双编码(例如 - %会在url中以%2525的形式出现)。

+1

这是不够的。 IIS正在将name + hello转换为名称%25%2bhello,该请求失败,并且请求不好 – 2011-05-05 17:01:17

+0

对我来说,无论我是否编码,都会出现问题。 200全状态代码。它实际上似乎是最准确的,当我**不**编码,并让路由和IIS通常做他们的事情。刚刚在Casini和IIS Express中使用锐利(#),百分比(%)和加号(+)示例进行了测试。你使用的是什么版本的IIS? – JasonOffutt 2011-05-05 17:42:44

+1

重现这个问题,你将不得不使用一个名为itemName的标记来设置一个路由 - 所以这个url看起来像这样:localhost/Items/Index/name%25with%25percent - 这个url包含非法字符 – 2011-05-05 19:48:12

4

由于这些路由值是作为URL字符串的一部分发布的,因此它们将被视为单独的值,用#和%分隔。有几个选项可以处理你的情况。

您将不得不实施您的自定义ValueProvider (IValueProvider and especially RouteDataValueProvider)来处理您的自定义需求。一个程序员遇到了字符'/'的问题,他在这里入侵了它http://mrpmorris.blogspot.com/2012/08/asp-mvc-encoding-route-values.html

其次是在TempData中存储值,该值持续存在于两个请求中并使用它们。

希望这有助于思考正确的方向。