Net Core MVC 将 URL 路由参数更改为 # 片段

Net Core MVC change URL routing parameter to be a # fragment

我希望我的最终路由参数在页面加载后变成 URL 片段。

因此,如果我提交 URL,例如:

https://mysite/controller/param1/param2

然后它通过我设置的路由访问我的控制器方法

public ActionResult Index(string param1, string param2) 

我怎样才能以某种方式重新路由它,以便生成的加载页面显示为

https://mysite/controller/param1#param2

您可以使用采用片段参数的 RedirectToAction() 重载之一来生成带有片段的 URL:

public virtual 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 个参数,这些参数将正确映射到 FragmentController 中的 Process() 操作:

// 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() 重载后,它会正确地重定向到控制器和你想要的操作,片段: