2011-07-18 102 views
6

ASP.NET MVC3/Razor。MVC3 URL编码?

我发现,当我创建一个操作环节,比方说,像这样:

@Html.ActionLink(product.Title, "Detail", "Products", new { id = product.ProductID }, null) 

的MVC3引擎创建我的产品链接。例如:

http://myhost/{ActionUrl}/PRODID 

但是,如果我的产品ID包含任何特殊字符,则它不会被URL编码。

http://myhost/{ActionUrl}/PROD/ID 

当然,这打破了我的路由。 我的问题是:

  1. 我应该期望它能自动对URL进行编码吗?有什么办法可以设置它吗?
  2. 如果不是,那么对它们进行编码和解码的最简洁的方法是什么?我真的不想在每个控制器中这样做。

谢谢!

回答

4

如果您的ID包含特殊字符,我建议您将它作为查询字符串传递,而不是路径的一部分。如果没有为颠簸的道路做好准备。结帐following blog post

+0

我花了一段时间才意识到,但你的回答完全正确。某些字符就像保留的关键字,你无法做任何事情。对于其他人,你可以做怪异的事情,甚至可以使用全路径,但一些特殊字符只能保持这种方式(除非你想用正则表达式重写)。 – Alpha

+1

那么作为查询字符串的代码是什么? –

1

我没有得到这个路径中的工作,但要使这项工作作为@Darin在此间指出,通过查询字符串参数是代码:

@Html.ActionLink(product.Title, "Detail", "Products", new { id = product.ProductID }, "") 

创建ActionLink的作为查询字符串我这样的:Products/Detail?id=PRODUCTID

我在Global.asax.cs中的路线是这样的:

routes.MapRoute(
     "ProductDetail", 
     "Products/Detail", 
     new { controller = "Products", action = "Detail" } 
     ); 

在我ProductController的:

public ActionResult Detail(string id) 
{ 
    string identifier = HttpUtility.HtmlDecode(id); 
    Store.GetDetails(identifier); 
    return RedirectToAction("Index", "Home"); 
} 
+0

当“PRODUCTID”包含“/”或“#”时会发生什么?控制器收到什么? – Alpha

+0

控制器接收/编码为%2f。 HttpUtility.HtmlDecode会将其转换回斜线。我没有代码设置来测试#但我期望控制器将收到%23 –

+0

谢谢,它确实有道理。我看到你也将它移动到查询字符串,但我正在使用它的路径部分。即使编码,它也会打破路径的形成。我正在寻找一种处理路径中的方法。谢谢! – Alpha