Net Core MVC изменить параметр маршрутизации URL на # fragment

#.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() .