Генерация RouteUrl в MVC3 возвращает ноль в одном случае - PullRequest
1 голос
/ 18 августа 2011

У меня есть маршрут, определенный следующим образом:

 routes.MapRoute("Date", "Date/{year}/{month}/{day}", 
    new { controller = "Date", action = "Index", year = UrlParameter.Optional,
         month = UrlParameter.Optional, day = UrlParameter.Optional });

Таким образом, у него есть 3 необязательных параметра: год, месяц и день.Он отлично работает при маршрутизации GET-запроса, все следующие прекрасно работают:

http://myhost/myapp/Date
http://myhost/myapp/Date/2011
http://myhost/myapp/Date/2011/8
http://myhost/myapp/Date/2011/8/17

Генерация ссылок с использованием RouteUrl работает во всех случаях, кроме одного.ссылка в том числе год и месяц работает нормально.Я использую следующий (упрощенный) код на мой взгляд:

 string linkUrl = Url.RouteUrl("Date",
     new { controller = "Date", year = 2011, month = 8 },
     Request.Url.Scheme);

Но случай, когда определен только год, не работает и возвращает ноль, код:

string linkUrl = Url.RouteUrl("Date",
    new { controller = "Date", year = 2011 },
    Request.Url.Scheme);

Так что для меня все выглядит правильно.Любая подсказка, что я делаю неправильно, или как отлаживать это дальше.

1 Ответ

2 голосов
/ 18 августа 2011

Хорошо, похоже, это известная проблема, появившаяся в MVC3, но из-за основной проблемы маршрутизации в .NET4, поэтому команда MVC не может быстро ее исправить. Хотя бесшумное возвращение нулевого значения явно является ошибкой, неясно, следует ли разрешить маршруту, который я изначально создал, работать так, как я этого хотел (см. Ниже).

Я нашел этот SO Вопрос , который просит людей повторить аналогичную проблему с двумя дополнительными параметрами, и ответ также относится к этой статье , в которой есть обходной путь. *

Я решил эту проблему в соответствии с обходным решением, сделав несколько маршрутов, используя только один необязательный параметр в каждом.

  routes.MapRoute(
    "Date-ByDay", // Route name
    "Date/{year}/{month}/{day}", // URL with parameters
    new { controller = "Date", action = "Index" } // Parameter defaults
  );

  routes.MapRoute(
    "Date-ByMonth", // Route name
    "Date/{year}/{month}", // URL with parameters
    new { controller = "Date", action = "Index", month = UrlParameter.Optional } // Parameter defaults
  );

  routes.MapRoute(
    "Date-ByYear", // Route name
    "Date/{year}", // URL with parameters
    new { controller = "Date", action = "Index", year = UrlParameter.Optional } // Parameter defaults
  );

Можно утверждать, должен ли мой первоначальный подход работать в любом случае, к примеру, что если вы пропустите параметр ТИнструкция месяца ', и если оригинальный маршрут генерировать URL из / 2011/18? «Обходной путь», хотя и уродливый, безусловно, гораздо более откровенен в отношении поведения, которое вы хотите. Я бы сказал, что ожидаемое поведение моего первоначального маршрута является понятным (для меня), и что я ожидал бы исключения, если бы попросил маршрут с годом и днем, пропуская месяц - но я вижу, что это может быть не всем точка зрения. Однако это сработало в MVC2.

...