Это упрощенный пример проблемы, с которой я столкнулся сегодня утром, с маршрутизацией URL ASP.NET MVC.
Довольно просто, я хотел, чтобы вызывалось действие маршрута независимо от того, был ли параметр вend был предоставлен.
Этот маршрут работает нормально, соответствуя / apple / и / apple / test /
routes.MapRoute(
"Working Route",
"apple/{parameter}",
new {
controller = "Apple",
action = "Action",
parameter = UrlParameter.Optional
},
new { parameter = @"([a-z0-9\.-]+)" }
);
Однако этотвторой маршрут будет соответствовать только / банан / тест / и тому подобное.Когда я пытаюсь / banana / , маршрутизатор просто проходит прямо через него и возвращает ошибку универсального сообщения 404.
routes.MapRoute(
"Non-Working Route",
"banana/{parameter}",
new {
controller = "Banana",
action = "Action",
parameter = UrlParameter.Optional
},
new { parameter = @"([a-z0-9]+)" }
);
Единственное отличие заключается в проверке параметров в Regex, нопоскольку это довольно простое совпадение с Regex, они оба должны отлично работать для URL, например / banana / , но второй маршрут просто не может его распознать.
Я обошел проблемупросто изменив Regex на маршруте # 2, чтобы он соответствовал этому на маршруте # 1, и примите '.'и символы «-», я просто подумал, знает ли кто-нибудь, почему это происходит.
РЕДАКТИРОВАТЬ:
Вот контроллеры и действия, которые я использую для моего примера.Здесь ничего необычного.
public class AppleController : Controller
{
public ActionResult Action(string parameter)
{
if (parameter == null)
{
parameter = "No parameter specified.";
}
ViewData["parameter"] = parameter;
return View();
}
}
public class BananaController : Controller
{
public ActionResult Action(string parameter)
{
if (parameter == null)
{
parameter = "No parameter specified.";
}
ViewData["parameter"] = parameter;
return View();
}
}
Так что моя проблема в том, что / apple / будет отображать «Параметр не указан», тогда как / banana / дает мне нежелательныеВместо 404.
Пока ..
Использование параметр = URLParameter.Optional в объявлении маршрута: маршрут № 1 работает отлично, маршрут № 2 не соответствует без параметра.
Использование параметр = "" в объявлении маршрута: оба маршрута № 1 и маршрут № 2 не совпадают, если параметр не указан в URL.
Объявление параметр = "" в сигнатуре метода Action: невозможно из-за версии .NET.
Удаление всех других маршрутов не имеет никакого эффекта.