了解 ASP Net Core 生成的 URL 标签助手。 [FromRoute] 或 [FromQuery]

Understanding ASP Net Core generated URL tag helper. [FromRoute] or [FromQuery]

我遇到这个问题,从视图生成 URL 时 ASP Net Core 不一致。

我用2个案例来描述我的问题。注意 View 中有标签助手 asp-route-....。我尝试更改 asp-route-.... 中的变量名称,结果它生成了一个不一致的 URL

案例一:

查看

<a asp-action="Edit" asp-route-p_id="@item.CustomerContactInfoId" >Edit</a> 

生成URL

localhost/CustomerContactInfo/Edit?p_id=1 // So in controller I have to use FromQuery instead of FromRoute

控制器

public async Task<IActionResult> Edit([FromQuery(Name ="p_id")]int? p_id) 
//OR 
public async Task<IActionResult> Edit(int? p_id)

问题=为什么生成的URL不是这样的

localhost/CustomerContactInfo/1

案例二:

查看

<a asp-action="Edit" asp-route-id="@item.CustomerContactInfoId" >Edit</a> 

生成URL

localhost/CustomerContactInfo/1  // So in controller I have to use FromRoute instead of From

控制器

public async Task<IActionResult> Edit([FromRoute(Name ="id")]int? p_id)
//OR 
public async Task<IActionResult> Edit(int? id)

问题=为什么生成的URL不是这样的

localhost/CustomerContactInfo/Edit?id=1

原来是因为路由参数的默认名称是 id 正如你在 Startup.cs configure() 方法中看到的那样

app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

然后

如果您将 {id?} 更改为 {p_id?},根据您在 Case 1 中的问题,它将是

/*-------In View--------------*/
<a asp-action="Edit" asp-route-p_id="@item.CustomerContactInfoId" >Edit</a> 

/*------Generated URL---------*/
localhost/CustomerContactInfo/1

/*------In controller---------*/
public async Task<IActionResult> Edit([FromRoute(Name ="p_id")]int? p_id) 
//OR 
public async Task<IActionResult> Edit(int? p_id)

而在 Case 2 将是

/*-------In View--------------*/
<a asp-action="Edit" asp-route-id="@item.CustomerContactInfoId" >Edit</a> 

/*------Generated URL---------*/
localhost/CustomerContactInfo/Edit?id=1

/*------In controller---------*/
public async Task<IActionResult> Edit([FromRoute(Name ="p_id")]int? p_id)
//OR 
public async Task<IActionResult> Edit(int? p_id)

您可以在Microsoft Documentation

中找到解释