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()
重载后,它会正确地重定向到控制器和你想要的操作,片段:
我希望我的最终路由参数在页面加载后变成 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()
重载后,它会正确地重定向到控制器和你想要的操作,片段: