asp.net мвк роутинг и таинственный 404 - PullRequest
1 голос
/ 16 января 2011

Я новичок в .net mvc. Короче говоря, я хочу видеть свой веб-сайт, чтобы люди могли печатать: МойВебСайт / John @ Эрик и обработаться правильным контроллером.

С другой стороны, я хотел бы также иметь возможность указывать прямые действия, такие как: МойВебСайт / GetPeople

и получите обработанный действием GetPeople.

Я установил два правила маршрутизации в своем приложении:

Первый маршрут

    routes.MapRoute("Default",
                    "{id}",
            new { controller = "Friends", action = "Index", id = UrlParameter.Optional },
            new { controller = @"[^\.]*", id = @"(?i)[a-z]*@[a-z]*" }
        );

Второй путь

    routes.MapRoute(
        "Friends",
        "{action}/{id}",
        new { controller = "Friends" }
        );

Первый маршрут и маршрут по умолчанию отлично работает, но потом, когда я отправляю запрос вроде этого: mywebsite / GetPeople Действие Cheacky Index вступает во владение и читает GetPeople, как если бы это был параметр. Несмотря на то, что я добавил свой настоящий удивительный регакс, похоже, это не сработало.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 16 января 2011

Вот как могут выглядеть ваши маршруты:

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

    routes.MapRoute(
        "Friends",
        "{id}",
        new { controller = "Friends", action = "Index", id = UrlParameter.Optional },
        new { id = @"(?i)[a-z]*@[a-z]*" }
    );

    routes.MapRoute(
        "Default",
        "{action}/{id}",
        new { controller = "Friends", action = "Index", id = UrlParameter.Optional }
    );
}

Теперь mywebsite/John@Eric будет обрабатываться действием Index контроллера Friends, а mywebsite/GetPeople будет обрабатываться действием GetFriends контроллера Friends.

0 голосов
/ 16 января 2011

Это связано с тем, как в MVC работает маршрутизация.Он просто сопоставляет входящие URL с маршрутами в том порядке, в котором маршруты объявлены в RegisterRoutes.В этом случае GetPeople в URL будет соответствовать параметру Id, поскольку все является необязательным.Чтобы это исправить, я бы добавил по умолчанию в качестве последнего маршрута.Это может быть сделано так:

routes.MapRoute("", "{controller}/{action}", new { controller = "Friends",action="Index" });

Это будет обрабатывать URL-адрес GetMyPeople.Вы должны были бы иметь действие Индекса на это все же.MvcContrib имеет отличный помощник для тестирования маршрутов MVC перед тем, как запускать его из приложения.Вы можете получить биты здесь

...