我正在使用像这样的路线:
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); }
当我调用返回RedirectToAction(“NewInvoice”,“Customer”,new {name});并且名称等于“C#Guy”,“name”参数被截短为“C”.
所以我的问题是:使用ASP.NET MVC处理这种特殊字符的最好方法是什么?
谢谢!
解决方法
好的,我确认这是现在ASP.NET路由中的一个已知问题,不幸的是.问题在于,在路由深处,我们在转移Uri的路由参数时使用Uri.EscapeString.但是,该方法不会退出“#”字符.
请注意,#字符(也称为Octothorpe)在技术上是错误的字符. C♯语言实际上是一个“C”,其次是音乐中的夏普标志:http://en.wikipedia.org/wiki/Sharp_(music)
如果你使用了尖锐的标志,那可能会解决这个问题. :P
另一个解决方案,因为大多数人想要使用octothorpe是为此路由编写一个自定义路由,并且在获取虚拟路径路径之后,使用编码#到#的HttpUtility.UrlEncode编码#符号.
作为一个后续行动,我想指出这个博文,其中谈到传递其他“无效”字符. http://haacked.com/archive/2010/04/29/allowing-reserved-filenames-in-URLs.aspx