使用参数调用 ASP.Net 核心 MVC 控制器操作不起作用
Invoke ASP.Net Core MVC controller action with parameter doesn't work
我有一个简单的 ASP.NET 核心 MVC 控制器操作方法定义为:
public class MyMVCController : Controller
{
public async Task<IActionResult> MyAction(String usrid)
{
// ...
}
}
当我使用这个 URI 调用它时:
https://localhost:6009/MyMVC/MyAction/073214df
我的操作被调用并且我返回 return,但参数 usrid
始终为空。我做错了什么?
更新
@Jackdaw 的第一个解决方案,将参数名称从 usrid
更改为 id
对我有用。但是,具有属性的则没有。虽然确实传入了参数,但操作将失败,因为下面一行中的 accessToken
以某种方式 return 为 null。第一种解决方案不是这样。
[Route("MyMVC/MyAction/{usrid?}")]
public async Task<IActionResult> MyAction(String usrid)
{
var accessToken = await HttpContext.GetTokenAsync("access_token");
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
// ...
}
最后,我想出了如何让基于属性的路由解决方案发挥作用——向操作方法添加另一个属性 [Authorize]
。不要问我为什么我必须这样做,为什么我不在 usrid
/id
解决方案中。
这是因为默认路由模式具有以下定义:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
因此,如果将方法参数名称更改为id
,它将起作用:
public async Task<IActionResult> MyAction(String id)
或者您可以将以下路由属性应用于该方法:
[Route("MyMVC/MyAction/{usrid?}")]
public async Task<IActionResult> MyAction(String usrid)
{
// ...
}
测试截图:
我有一个简单的 ASP.NET 核心 MVC 控制器操作方法定义为:
public class MyMVCController : Controller
{
public async Task<IActionResult> MyAction(String usrid)
{
// ...
}
}
当我使用这个 URI 调用它时:
https://localhost:6009/MyMVC/MyAction/073214df
我的操作被调用并且我返回 return,但参数 usrid
始终为空。我做错了什么?
更新
@Jackdaw 的第一个解决方案,将参数名称从 usrid
更改为 id
对我有用。但是,具有属性的则没有。虽然确实传入了参数,但操作将失败,因为下面一行中的 accessToken
以某种方式 return 为 null。第一种解决方案不是这样。
[Route("MyMVC/MyAction/{usrid?}")]
public async Task<IActionResult> MyAction(String usrid)
{
var accessToken = await HttpContext.GetTokenAsync("access_token");
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
// ...
}
最后,我想出了如何让基于属性的路由解决方案发挥作用——向操作方法添加另一个属性 [Authorize]
。不要问我为什么我必须这样做,为什么我不在 usrid
/id
解决方案中。
这是因为默认路由模式具有以下定义:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
因此,如果将方法参数名称更改为id
,它将起作用:
public async Task<IActionResult> MyAction(String id)
或者您可以将以下路由属性应用于该方法:
[Route("MyMVC/MyAction/{usrid?}")]
public async Task<IActionResult> MyAction(String usrid)
{
// ...
}
测试截图: