我正在使用像这样的路线:
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});
且名称等于“C#Guy”时,“name”参数将被截断为“The C”。
所以我的问题是:用ASP.NET MVC处理这种特殊字符的最佳方法是什么?
谢谢!
答案 0 :(得分:16)
好的,遗憾的是,我确认这是现在 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
答案 1 :(得分:3)
网址编码!更改链接,使其编码特殊字符。
Server.URLencode(strURL)
C#将变为“c%23”。
答案 2 :(得分:3)
在我的机器上运行。这就是我创建最简单的例子。
//Global.asax.cs
using System.Web.Mvc;
using System.Web.Routing;
namespace MvcApplication4 {
public class MvcApplication : System.Web.HttpApplication {
public static void RegisterRoutes(RouteCollection routes) {
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
routes.MapRoute("Invoice-New-NewCustomer",
"Invoice/New/Customer/New/{*name}",
new { controller = "Customer", action = "NewInvoice" },
new { name = @"[^\.]*" });
}
protected void Application_Start() {
RegisterRoutes(RouteTable.Routes);
}
}
}
//HomeController.cs
using System.Web.Mvc;
namespace MvcApplication4.Controllers {
[HandleError]
public class HomeController : Controller {
public ActionResult Index() {
return RedirectToAction("NewInvoice", "Customer", new { name = "The C# Guy" });
}
}
}
//CustomerController.cs
using System.Web.Mvc;
namespace MvcApplication4.Controllers {
public class CustomerController : Controller {
public string NewInvoice(string name) {
return name;
}
}
}
然后我启动了我的应用并导航到/ home / index。重定向发生了,我在浏览器中看到了“The C#Guy”。