Ошибка маршрута MVC: запись ограничения «Длина» - PullRequest
8 голосов
/ 18 января 2012

У меня есть контроллер с именем Account, действие которого имеет следующую подпись:

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 в 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. В чем здесь проблема?

Спасибо

Сэчины

Ответы [ 2 ]

13 голосов
/ 18 января 2012

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

"UI.Controllers"

до

new[] { "UI.Controllers" }

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

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

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

Полный код:

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" }
        );
    }
2 голосов
/ 18 января 2012

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

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