Asp.Net Core 中控制器方法中的绑定 Guid

Posted

技术标签:

【中文标题】Asp.Net Core 中控制器方法中的绑定 Guid【英文标题】:Binding Guid in Controller method in Asp.Net Core 【发布时间】:2021-10-09 12:01:37 【问题描述】:

我有控制器方法:

    [EnableCors("MyPolicy")]
    [Route("page/session:guid")]
    [HttpGet("page")]
    public async Task<ActionResult<DtoResult>> GetPageAsync(Guid session, int page = -1,  int pageSize = -1)
    
            var result = await _paginationInfrastructure.GetDtos(session, page, pageSize, _reportManagerService);
            return Ok(result);
    

Angular 客户端 http 代码:

getPage(sessionGuid: string, pageIndex: number, pageSize: number): Observable<ReportDtoResult> 
var paginationUrl = this.configService.getPaginationUrl();
var fullPaginationUrl = `$paginationUrl`;
  
var paramsArgs = new HttpParams();
paramsArgs.set('session',sessionGuid);
paramsArgs.set('page',pageIndex);
paramsArgs.set('pageSize',pageSize);
return this.http.get<DtoResult>(fullPaginationUrl,params:paramsArgs);

通过 Swagger 请求:

curl -X GET "https://localhost:5001/page/081B1B5A-9875-4813-B5ED-A131598B3FC4?page=-1&pageSize=-1" -H "accept: text/plain"

所以,当从客户端向服务器发送 Guid 字符串时,我得到空的 guid。 我尝试进行路由,但它不适合我。

如何提出有效的请求?

附:请求必须是:

var fullPaginationUrl = `$paginationUrl/$sessionGuid?page=$pageIndex&pageSize=$pageSize`;

而且它有效! 谢谢!

【问题讨论】:

【参考方案1】:

问题不在于您的路由设置,而在于您在 Angular 中发出请求的方式。

您将 guid 添加为名为 session 的查询参数。相反,您需要做的是使其成为路径的一部分(根据您的配置)。

所以你的请求应该如下所示:

...
var fullPaginationUrl = `$paginationUrl/$sessionGuid`;

var paramsArgs = new HttpParams();
paramsArgs.set('page', pageIndex);
paramsArgs.set('pageSize', pageSize);
...

以上假设paginationUrlhttps://localhost:5001/page

[Route("page/session:guid") 中的 session 只是指定您将 guid 映射到的参数名称在您的操作方法中

【讨论】:

以上是关于Asp.Net Core 中控制器方法中的绑定 Guid的主要内容,如果未能解决你的问题,请参考以下文章

[十二] ASP.NET Core 中的模型绑定

[十二] ASP.NET Core 中的模型绑定

ASP.NET Core 中的模型绑定

ASP.NET Core 模型未通过 AJAX 绑定到控制器

获取 ASP.NET-Core 2.2 控制器中的控制器名称和方法名称

如何知道 ASP.NET 中控制器索引的调用者路由?