如何传递特殊字符,以便ASP.NET MVC可以正确处理查询字符串数据?

时间:2008-12-17 03:46:44

标签: asp.net-mvc

我正在使用像这样的路线:

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处理这种特殊字符的最佳方法是什么?

谢谢!

3 个答案:

答案 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”。