2012-01-18 2 views
7

У меня есть контроллер с именем учетной записью с действием со следующей подписью:MVC маршрут Ошибка: ограничение входа «Длина»

public ActionResult Verify(string userName, Guid authorisationToken); 

Я создал ссылку, чтобы назвать это действие таким образом:

/Account/Verify/sachin13/409bdaaa-0b65-4bb8-8695-6e430323d8f8 

Когда я иду по этой ссылке, я получаю следующее сообщение об ошибке:

The constraint entry 'Length' on the route with URL 'Account/{Verify}/{userName}/{authorisationToken}' must have a string value or be of a type which implements IRouteConstraint. 

Это то, что мой метод RegisterRoutes выглядит Li ка в Global.asax:

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 = UrlParameter.Optional } ,// Parameter defaults 
       new[] { "UI.Controllers" } 
      ); 

      routes.MapRoute(
       "AccountVerify", 
       "Account/{Verify}/{userName}/{authorisationToken}", 
       new { controller = "Account", action = "Verify", userName = "", authorisationToken = "" }, 
       "UI.Controllers" 
      ); 
     } 

Два вопроса:

  1. Я делаю что-нибудь из обычных или моя методологии здесь, в соответствии со стандартной практикой?

  2. В чем проблема?

Спасибо,

Сэчин

ответ

12

Вы должны изменить

"UI.Controllers"

в

new[] { "UI.Controllers" }

в вашем втором маршруте.

Если вы указываете только одну строку (не массив), то вы получите неправильную перегрузку MapRoute функции - вместо MapRoute(RouteCollection, String, String, Object, String[]), которые принимают список пространств имен, как последнего параметра вы получаете MapRoute(RouteCollection, String, String, Object, Object) который ожидает ограничения как последнего параметра. Строка «UI.Controllers» не является правильной спецификацией ограничения => вы получаете ошибку.

Также, поскольку @Pankaj предложил, чтобы ваш пользовательский маршрут следовал перед дефолтом, а подтверждение должно быть без «{}».

Полный код:

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

     routes.MapRoute(
      "AccountVerify", 
      "Account/Verify/{userName}/{authorisationToken}", 
      new { controller = "Account", action = "Verify", userName = "", authorisationToken = "" }, 
      new [] { "UI.Controllers" } 
     ); 

     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } ,// Parameter defaults 
      new[] { "UI.Controllers" } 
     ); 
    } 
+3

Сергей, сэр - это было блестяще - это сработало. Я должен тебе пиво. –

2

Всегда объявляйте пользовательский маршрут, прежде чем по умолчанию маршрут таким образом, чтобы заставить его работать, как они работают в порядке от первого до последнего. Поэтому вам нужно объявить свой второй маршрут до маршрута по умолчанию, и он должен решить проблему, я полагаю. Кроме того, удалить "{}" для Убедитесь, во втором маршруте

+0

блестящий комментарий - спасибо Панкай. Но почему мне нужно удалить {}? –

+2

Чтобы убедиться, что только URL-адрес «Проверить» на основе сегмента разрешен для использования настраиваемого маршрута ... Если вы используете «{}», то URL-адрес «/ Account/AnyOtherValue/sachin13/409bdaaa-0b65-4bb8- 8695-6e430323d8f8' также направит на то же действие, а не покажет ошибку 404. –

+0

спасибо - палец вверх к вам. –