我正在使用这样的路线:
routes.MapRoute("Invoice-New-NewCustomer", "Invoice/New/Customer/New/{*name}", new { controller = "Customer", action = "NewInvoice" }, new { name = @"[^\.]*" });
有一个动作可以处理这条路线:
public ActionResult NewInvoice(string name) { AddClientSideValidation(); CustomerViewData viewData = GetNewViewData(); viewData.InvoiceId = "0"; viewData.Customer.Name = name; return View("New", viewData); }
当我调用return RedirectToAction("NewInvoice", "Customer", new {name});
并且name等于"C#Guy"时,"name"参数被截断为"The C".
所以我的问题是:使用ASP.NET MVC处理这种特殊字符的最佳方法是什么?
谢谢!
好吧,我确认这是现在在ASP.NET路由一个已知的问题,很遗憾.问题是在路由的深处,我们在转义Uri的路由参数时使用Uri.EscapeString.但是,该方法不会转义"#"字符.
请注意,#character(aka Octothorpe)在技术上是错误的字符.C♯语言实际上是一个"C",后跟一个Sharp符号,如音乐:http://en.wikipedia.org/wiki/Sharp_ (music )
如果您使用了尖锐的符号,那么可能会解决这个问题.:P
另一个解决方案,因为大多数人都想使用octothorpe是为这条路线写一条自定义路线,在获得虚拟路径路径后,使用编码#to%23的HttpUtility.UrlEncode对#符号进行编码.
作为后续行动,我想向您指出这篇博文,其中讨论了传递其他"无效"角色的问题.http://haacked.com/archive/2010/04/29/allowing-reserved-filenames-in-URLs.aspx