Хорошо, я понял это и воспроизвел его в тестовой среде. Это из-за маршрутизации.
В MVC, когда вы используете общий улов все маршрут, как вы сделали здесь:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Он всегда будет относиться к индексу, как действие по умолчанию отображается в корень контроллера. Таким образом, localhost/somecontroller всегда будет вызывать индекс, а url будет загружать индекс либо в localhost/somecontroller, либо в localhost/somecontroller/index.
Есть 2 способа решения этой проблемы, начиная с самого простого
Решение 1:
На контроллере службы, не называйте ваш метод Index, назовите его что-нибудь еще, как NotIndex, IDoStuff, без разницы. Просто это приведет к перенаправлению перенаправления на Service/IDoStuff (w/e). Однако этот метод означает, что localhost/appname/service создаст 404 (поскольку действие по умолчанию «Индекс» не существует).
Решение 2: Позволяет держать действия с именем Index
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Home",
url: "Home/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Service",
url: "Service/Index/{id}",
defaults: new { controller = "Service", action = "Index", id = UrlParameter.Optional }
);
Решение 2 Проблема Определение строгих маршрутов, как это, нарушает ваши умолчанию поймать маршрут все, и если вы принесете поймать по умолчанию все пути назад назад к исходной проблеме, потому что MVC будет проходить через набор маршрутов и применять каждый маршрут к URL-адресу до тех пор, пока не найдет тот, который соответствует, первый соответствует ему, если он не находит подходящего маршрута, а затем bam 404 (Страница не найдена/нет ресурса).
Однако, как вы хотите, я строгий, не URLs недобросовестный, так что я сделал это я Решение 2.
Затем, чтобы получить обратно свой корень URL загрузки Главная -> Индекс Я добавил правила перезаписи в моем веб .config
<system.webServer>
<rewrite>
<rules>
<rule name="RootRedirect" stopProcessing="true">
<match url="^$" />
<action type="Redirect" url="/Home/Index/{R:0}" />
</rule>
</rules>
</rewrite>
</system.webServer>
для того, чтобы работать, вы должны иметь UrlRewrite включенными функциями в IIS (установлен), так что она существует в GAC/машине конфигурации и т.д.
Кроме того, правило перенаправления, как представляется, постоянное правило перенаправления, поэтому браузер будет перенаправлен на него без делая 2 запроса на сервер, как только браузер клиента посетил сайт за один раз до этого.
Покажите свои маршруты из 'RouteConfig.cs' –
Я не могу воспроизвести вашу проблему (отлично работает для меня). Хотя я предлагаю вам изменить параметр вашего метода 'Index()' в 'ServiceController' на' int id', а не 'int groupid', и использовать' return RedirectToAction («index», «service», new {id = service. GroupID}); 'поэтому он генерирует' ../ Service/Index/5', а не '../ Service/Index? Groupid = 5' (или добавить определенный маршрут с помощью' url: "Service/Index/{groupid} ", –
@Ryios: GroupID является целым типом. –