#.net-core #asp.net-core-mvc #asp.net-core-routing
#.net-core #asp.net-core-mvc #asp.net-core-routing
Вопрос:
Я хочу, чтобы мой окончательный параметр маршрута превратился во фрагмент URL после загрузки страницы.
Поэтому, если я отправлю URL, например:
https://mysite/controller/param1/param2
И он попадает в мой метод контроллера по маршруту, который я настроил
public ActionResult Index(string param1, string param2)
Как я могу каким-то образом перенаправить это, чтобы результирующая загруженная страница отображалась как
https://mysite/controller/param1#param2
Ответ №1:
Вы можете использовать одну из RedirectToAction()
перегрузок, которая использует параметр fragment, чтобы сгенерировать URL-адрес с фрагментом:
общедоступный виртуальный RedirectToActionResult RedirectToAction(string ActionName, string controllerName, string fragment);
Но сначала вам нужно будет настроить маршрут для сопоставления запроса, подобного https://mysite/controller/param1/param2
чему-то, что может удалить эти параметры из URL и вызвать RedirectToAction()
перегрузку. Я создал отдельный вызываемый контроллер FragmentController
и объявил вызываемый Process()
там метод:
// Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "fragment",
pattern: "fragment/{controllerName}/{actionName}/{fragmentName}",
defaults: new { controller = "fragment", action = "process" });
endpoints.MapControllerRoute(...);
});
}
Посмотрите, что новое сопоставление маршрутов ищет любой запрос, который начинается с /fragment
, за которым следуют 3 параметра, и эти параметры будут правильно сопоставлены с Process()
действием в FragmentController
:
// FragmentController.cs
public class FragmentController : Controller
{
public IActionResult Process(string controllerName, string actionName,
string fragmentName)
{
// You can do anything you want with those parameters, i.e., validations
return RedirectToAction(actionName, controllerName, fragmentName);
}
}
Вот и все. Поэтому, если https://localhost:44370/fragment/home/privacy/heading1
поступает запрос, подобный
Он будет правильно сопоставлен с действием процесса контроллера фрагмента:
После вызова RedirectToAction()
перегрузки он будет корректно перенаправлен на контроллер и нужное действие с фрагментом:
Комментарии:
1. Спасибо за ваш ответ @David Liang Как будет выглядеть действие, которое я перенаправляю, и как оно установит фрагмент в URL?
2. Действие, которое он перенаправляет, просто на метод действия конфиденциальности в домашнем контроллере. Это шаблон, который поставляется с VS2019 при создании нового проекта MVC. Для «как бы он установил фрагмент в URL» — я уже поделился этой частью в своем ответе — просто передав фрагмент в одну из перегрузок
RedirectToAction()
.