【问题标题】:How do I build an ASP.Net core web api Enpoint that handles query parameters with an equal '=' sign如何构建一个 ASP.Net 核心 web api 端点来处理带有等号“=”符号的查询参数
【发布时间】:2020-01-28 00:39:01
【问题描述】:

我想采用从这个 Angular 打字稿前端代码构建的端点

  getPartNumbersFromManufacture(manufactureNameId : Number)
  {
    let parameter = new HttpParams().set("FKManufactureNameId", manufactureNameId.toString()) 
    return this.http.get<ManufacturePartNumber[]>(this.manufactureUrl + '/PartNumber', {params: parameter}).pipe(
      tap(data => console.log('All: ' + JSON.stringify(data))),
      catchError(this.handleError)
    );
  }

这会产生如下所示的请求:

Request URL: https://localhost:5001/api/Manufacture/PartNumber?FKManufactureNameId=14703
Request Method: GET
Status Code: 200 OK
Remote Address: [::1]:5001
Referrer Policy: no-referrer-when-downgrade

.netcore C# 代码如下所示,端点被命中,但制造名称 ID 始终为 =0,如果我尝试将其更改为字符串,则为空。

    [Route("api/Manufacture")]
    public class ManufactureController : ControllerBase
    { ...
        [HttpGet("PartNumber/{FKManufactureNameId=manufactureNameID}")]
        public IEnumerable<Views.ManufacturePartNumber> PartNumbers(int manufactureNameID) //pass the manufacture id from the frontend and get the part numbers associated with this manufacturer
        {
            TrackingContext context = new TrackingContext();
            IEnumerable<ManufacturePartNumber> manufacturePartNumbers = context.ManufacturePartNumber.Where(n => n.FkManufactureNameId == manufactureNameID);

            List<Views.ManufacturePartNumber> manufacturePartNumberView = new List<Views.ManufacturePartNumber>();
            for (int i = 0; i < manufacturePartNumbers.Count(); i++)
            {
                manufacturePartNumberView.Add(new Views.ManufacturePartNumber(manufacturePartNumbers.ElementAt(i)));
            }
            return manufacturePartNumberView;
        }
   ...}

我做错了什么,我希望我的 C# 代码处理这个具有等号的查询参数,因为这似乎是“HttPClient”类在传递“HttpParams”对象时构建查询参数的标准方式。我知道如何处理 no '=' 但我猜 '=' 是新的标准/最佳实践?

【问题讨论】:

    标签: c# angular http asp.net-web-api asp.net-web-api2


    【解决方案1】:

    您的 api 声明似乎不准确。

    这就是我相信你想要做的:

     [HttpGet("PartNumber")] /* <--- */
     public IEnumerable<Views.ManufacturePartNumber> 
           PartNumbers(/* --> */[FromQuery]int manufactureNameID) 
            {...
    

    您希望从 QueryString 中获取参数,因此您可以在参数旁边使用 [FromQuery] 属性来表示,例如:

    [FromQuery]int manufactureNameID

    此外,您的 [HttpGet] 属性不需要添加任何其他内容,但“方法路由”在本例中为 [HttpGet("PartNumber")]

    【讨论】:

    • 我必须添加到您的代码中的小改动:我必须将“FKManufactureNameId”放在函数参数中,而不是“manufactureNameID”。如果我离开“manufactureNameID”,那么我仍然有同样的 0 & null 问题。你会更新你的答案,我会接受吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 2017-06-19
    • 1970-01-01
    • 2020-10-13
    相关资源
    最近更新 更多