正在将CustomId和Id路由到同一控制器



我正在尝试设置一个支持以下内容的路由图"{controller=Home}/{action=Index}/{id}={customid}";

例如,我有两个URL:

/Home/Index/1

/Home/Index?customid=1

如何将这两个URLS转到同一个控制器?

我目前在Startup中的映射非常简单:

endpoints.MapControllerRoute(
name: "areaRoute",
pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
"OnlyAction",
"{action}/{id?}",
new { controller = "Home", action = "Index" });
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");

这是我试图获得的控制器,以支持两个URL

[HttpGet]
[ActionName("GetRecords")]
public async Task<IActionResult> GetRecords(int id)

如果能指出正确的方向,我们将不胜感激。提前谢谢。

如果在输入/Home/Index/1/Home/Index?customid=1时需要执行GetRecords(int id)操作,则可以向操作方法添加以下属性:

[HttpGet]
[ActionName("GetRecords")]
[Route("/Home/Index/{customid?}")]
public async Task<IActionResult> GetRecords(int? customid)
{
// Place code here to process the request... 
}

customid参数被定义为可为null的类型int?,以便能够处理默认值。

有关更多信息,请参阅ASP.NET Core 中的路由到控制器操作

如果你对/Home/Index很满意,那么它最终会出现在GetRecords中,自定义值等于0,那么这应该可以在中工作

endpoints.MapControllerRoute(
"GetRecordsFromPath",
"Home/Index/{customId}",
new { controller = "Home", action = "GetRecords" });
endpoints.MapControllerRoute(
"GetRecordsFromQuery",
"Home/Index",
new { controller = "Home", action = "GetRecords" });
public async Task<IActionResult> GetRecords(int customid) //id -> customid

如果没有,那么您将需要以某种方式告诉aspnet对Home/IndexHome/Index?customid=1执行不同的操作

上升

您可以试用UseRewriter中间件,并有将/Home/Index?customid=1重写为/Home/Index/1的规则
如果您需要/Home/Index的不同操作方法,或者路径和查询有更复杂的场景,这可能会有所帮助。

Upd 2

这适用于

app.Use(async (context, next) =>
{
var url = context.Request.Path.Value;
if (url == "/Home/Index")
{
if (context.Request.Query.ContainsKey("customid"))
{
var customid = context.Request.Query["customid"];
context.Request.Path = $"/Home/Index/{customid}";
}
}
await next();
});

最新更新