我正在尝试设置一个支持以下内容的路由图"{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/Index
和Home/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();
});