2015-03-16 5 views
0

Мой проект ASP.NET MVC, кажется, игнорирует значения по умолчанию по умолчанию, когда составляет URL. Например, Url.Action("Index", "Home") возвращает , тогда как он должен вернуть только / (что я видел на всех моих других веб-сайтах MVC). У него нет никаких проблем с с использованием URL-адресов, например. посетив http://myserver/, контроллер и действие по умолчанию найдены правильно.MVC игнорирует параметры маршрута по умолчанию и отображает полный URL «/ Home/Index» вместо корня

Как я могу исправить поведение? (Обратите внимание, что я нашел questions вопрос, как достичь такого поведения, но никто, кажется, страдает от этой противоположной проблемы.)

Проект ничего особенного, никаких обработчиков пользовательских маршрутизации и т.д., а также конфигурация маршрутизации достаточно просто:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    routes.IgnoreRoute("LoginHandler"); 

    routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{*id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    ); 
} 

(. * есть, потому что некоторые действия использовать произвольные строки в качестве идентификаторов, которые могут содержать вложенные слэш, и без звездочки, маршрут не совпадает с такими адресами)

ответ

2

проблема ложь действительно в маленькой звездочке. Эти catch-all parameters, по-видимому, не соответствуют UrlParameter.Optional значениям по умолчанию и приводят к URL-адресу, всегда содержащему весь путь.

Если вы хотите сохранить поведение по умолчанию, а также позволяют использовать произвольные параметры, используя кетчуп всего синтаксис параметров, вы должны использовать кетчуп всех параметры во вторичном маршруте:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    routes.IgnoreRoute("LoginHandler"); 

    routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    ); 
    routes.MapRoute(
     name: "CatchAll", 
     url: "{controller}/{action}/{*id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    ); 
} 

С это определение, простые параметры, не содержащие косой черты, обрабатываются с использованием первого маршрута (как и генерация URL-адреса, когда не указывается точный маршрут, который будет использоваться), тогда как сложные параметры с косой чертой возвращаются ко второму маршруту и ​​обрабатываются правильно там.


(Обратите внимание, что это может быть просто ошибка в реализации MVC: Для улове-всех параметров, MVC в ParsedRoute.IsParameterRequired возвращает null в качестве значения параметра по умолчанию, который затем проверяется на соответствие поставляемого UrlParameter.Optional от значений по умолчанию, в и, как оказалось, будет отличаться. Поэтому вы можете изменить определение маршрута для использования id = null по умолчанию вместо id = UrlParameter.Optional вместо добавления вторичного маршрута, и он также работает, но, возможно, он может иметь нежелательные побочные эффекты. я также не уверен, что это поведение преднамеренное или просто ошибка.)

 Смежные вопросы

  • Нет связанных вопросов^_^