2016-04-26 5 views
1

Я использую ASP.NET Core MVC и используя маршрутизацию атрибутов в своих контроллерах.ASP.NET MVC Routing catch all

В моем методе Configure в Startup.cs В настоящее время я вызываю app.UseMvc() для запуска моего приложения MVC.

Все работает должным образом.

Теперь я пытаюсь поймать все, но 404 всегда получает лучшее из ситуации.

Я изменил свое app.UseMvc на следующее:

app.UseMvc(routes => 
{ 
    routes.MapRoute("Default", 
        "{*catchall}", 
        new { controller = "Index", action = "Index" }, 
        new { catchall = @"^(.*)?$" }); 
}); 

, но не кости.

Я даже попытался удалить обычный обычный экспресс, но я все равно перенаправляюсь на свою страницу 404.

Любая помощь приветствуется!

+0

Убедитесь, что у вас есть в '' IndexController' с Index() 'действия – Nkosi

+0

я.мой IndexController имеет '[Route (" ")]' и имеет метод 'Index()', который устанавливается следующим образом: '[HttpGet] public IActionResult Index() {return View(); } ' – DOMZE

+1

Я думаю, что вы смешиваете маршрутизацию на основе конвенций и маршрутизацию атрибутов. Ваш захват будет применяться к контроллерам, которые не используют маршрутизацию атрибутов. Это для контроллера веб-api или контроллера mvc. – Nkosi

ответ

1

Для тех, кто с той же проблемой, Том Droste толкнул меня в правильном направлении

Добавление обычного маршрута и с использованием маршрутизации атрибутов имеет тонкие побочные эффекты Улов-все маршрут был добавлен первым в маршруте словарь и маршруты атрибутов добавляются впоследствии.

Класс AttributeRouting просто создает экземпляр AttributeRoute, который является IRouter, ответственным за построение маршрутов атрибутов. Это делается в первый раз, когда вызывается AttributeRoute.

Таким образом, уловка так и не была вызвана, потому что это не последний маршрут. ставит все обратно в обычную маршрутизацию, исправляя проблему.

Я предлагаю читать https://luisfsgoncalves.wordpress.com/2015/08/18/asp-net-5-routing-part-ii/, чтобы понять, как маршрутизация атрибутов работает

0

Вы пробовали это?

routes.MapRoute(
    "Default", 
    "{*.}", 
    new { controller = "Home", action = "Index" } 
); 
+0

Да, это то же самое, что удаление обычного выражения из того, что я написал выше. – DOMZE

0

В файле Startup.cs, поместите следующую строку кода непосредственно над app.UseMvc() в Configure() метод. Очевидно, вы можете перенаправить на любую страницу, которую хотите.

app.UseStatusCodePagesWithRedirects("~/Home/Index"); 

EDIT:
За вами комментарий, насколько я знаю, вы должны написать свой собственный промежуточное программное обеспечение для перенаправления и сохранить исходные параметры URL/запроса. Если вы не знакомы с разработкой промежуточного программного обеспечения, я опубликовал демонстрационный проект GitHub, который демонстрирует, как разработать промежуточное программное обеспечение в три простых шага. Вы можете скачать проект here.

+0

Это работает .. однако, как я могу сохранить параметры запроса, а что нет? как можно сказать, я перехожу в/thispage/doesnot/exist перенаправляется на ~/Home/Index, но я хочу сохранить/thispage/doesnot/exist в url ... – DOMZE

+0

Я отредактирую свой ответ. –

+0

Прохладный выглядит интересно! посмотрим. Вопрос, который у меня есть, заключается в том, почему не применяется маршрут по умолчанию? – DOMZE

0

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

routes.MapRoute(
    "DirtyRoutingSolution", 
    "{notUsed?}/{notUsedTwo?}/{notUsedThree?}/{notUsedFour?}", 
    new { controller = "Home", action = "Index"} 
); 
+0

Правильно, я хочу, чтобы, если маршрут/ABC не существует, он загружает/вместо этого, но сохраняет/ABC в URL-адресе. В принципе, любой непревзойденный маршрут должен загружать мой по умолчанию – DOMZE

+0

Если это так, это быстрое и грязное решение для этого. Просто создайте количество «не использовано»? как ваш самый длинный url. Таким образом, он все поймает. –

+0

Я скопировал вставку именно то, что вы написали выше, и если я ставлю/ABC, он все равно приведет меня к странице 404 ... кажется, что этот маршрут никогда не называется. Обычный набор маршрутизации перед маршрутизацией атрибута? Технически этот маршрут должен быть последним для работы, исправьте меня, если я ошибаюсь – DOMZE