Как передать специальные символы, чтобы ASP.NET MVC мог правильно обрабатывать данные запроса строки - PullRequest
15 голосов
/ 17 декабря 2008

Я использую маршрут, подобный этому:

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», параметр «имя» усекается до «The C».

Итак, мой вопрос: как лучше всего обрабатывать такого рода специальные символы в ASP.NET MVC?

Спасибо!

Ответы [ 3 ]

16 голосов
/ 31 декабря 2008

Хорошо, я подтвердил, что теперь известная проблема в маршрутизации ASP.NET, к сожалению. Проблема в том, что глубоко в недрах маршрутизации мы используем Uri.EscapeString при экранировании параметров маршрутизации для Uri. Однако этот метод не экранирует символ "#".

Обратите внимание, что символ # (он же Octothorpe) является технически неправильным символом. C♯ язык на самом деле представляет собой «C», за которым следует знак «Sharp», как в музыке: http://en.wikipedia.org/wiki/Sharp_(music)

Если вы используете острый знак, это может решить эту проблему. : P

Другое решение, так как большинству людей захочется использовать octothorpe, - написать собственный маршрут для этого маршрута и после получения пути виртуального пути закодировать знак # с помощью HttpUtility.UrlEncode, который кодирует # в% 23.

В качестве продолжения я хотел бы указать вам на это сообщение в блоге, в котором говорится о передаче других «недопустимых» символов. http://haacked.com/archive/2010/04/29/allowing-reserved-filenames-in-URLs.aspx

3 голосов
/ 17 декабря 2008

Работает на моей машине. Вот что я сделал, чтобы создать самый простой пример.

//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. Произошло перенаправление, и в моем браузере я увидел «C # Guy».

3 голосов
/ 17 декабря 2008

Кодировка URL! Измените ссылку, чтобы она кодировала специальные символы.

Server.URLencode(strURL)

C # станет "c% 23".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...