ASP.NET Core - 尝试创建一个按 ID 删除多条记录的端点

Posted

技术标签:

【中文标题】ASP.NET Core - 尝试创建一个按 ID 删除多条记录的端点【英文标题】:ASP.NET Core - Trying to create an endpoint which deletes multiple records by ID 【发布时间】:2022-01-04 21:18:51 【问题描述】:

我正在尝试创建一个应该删除多个 ID 的端点。它应该匹配deleteRoom(ids: number[])。您可以在下面看到我尝试过的内容,但它与 angular 的请求不匹配。

deleteRoom(ids: number[]) 
  return this.httpClient.delete(`$this.actionUrl?id=$ids.toString()`);

public class RoomsController : ApiControllerBase

    [HttpGet]
    public async Task<ActionResult<IList<RoomDto>>> GetRooms()
    
        var result = await Mediator.Send(new GetRoomsQuery()).ConfigureAwait(false);

        return Ok(result);
    

    [HttpGet("available")]
    public async Task<ActionResult<IList<RoomDto>>> GetAvailableRooms(
        [FromQuery] DateTime from,
        [FromQuery] DateTime to,
        [FromQuery] int? departmentId,
        [FromQuery] RoomType? roomType)
    
        var query = new GetAvailableRoomsQuery
        
            From = from,
            To = to,
            DepartmentId = departmentId,
            RoomType = roomType
        ;

        var result = await Mediator.Send(query).ConfigureAwait(false);

        return Ok(result);
    


    [HttpPost]
    public async Task<ActionResult<int>> Create(CreateRoomCommand command)
    
        return await Mediator.Send(command).ConfigureAwait(false);
    

    [HttpPut("id:int")]
    public async Task<ActionResult> Update(int id, UpdateRoomCommand command)
    
        if (id != command.Id) return BadRequest();

        await Mediator.Send(command).ConfigureAwait(false);

        return NoContent();
    

    [HttpDelete("id:int")]
    public async Task<ActionResult> Delete(int id)
    
        await Mediator.Send(new DeleteRoomCommand Id = id).ConfigureAwait(false);

        return NoContent();
    

    [HttpDelete("ids")]
    public async Task<ActionResult> Delete(int[] ids, DeleteRoomsCommand command)
    
        await Mediator.Send(command).ConfigureAwait(false);

        return NoContent();
    

【问题讨论】:

你检查$this.actionUrl?id=$ids.toString()表达式的值是什么? @Chetan, `localhost:5001/api/Rooms?id=9,10` 9,10 转换为服务器上的数组...您可能想尝试像http://example.net/api/rooms?ids[0]=9&amp;ids[1]=10 这样构建您的 URL,首先从邮递员那里尝试这个,看看您是否能够调用 API。然后,您可以更改 Angular 代码以 tis 形式为多个 id 创建 URL。 【参考方案1】:

在get request中有两种方式使用多个id

    路线值

你的网址应该是这样的(你可以用别的东西代替“,”)

http:\\....\deleteRooms\1,2,3,4

动作应该是这样的

[HttpGet("DeleteRooms/ids")] //or httpdelete
public ActionResult DeleteRooms(string ids)

  string[] roomIds = ids.split(",");
  ...

    查询字符串
http:\\....\deleteRooms?ids=1&ids=2&ids=3&ids=4

动作可以是

[HttpGet("DeleteRooms")] //or httpdelete
public ActionResult DeleteRooms(int[] ids)

   ...

【讨论】:

谢谢!我用了第二个,但你忘了[FromQuery]public async Task&lt;ActionResult&gt; Delete([FromQuery] int[] ids)【参考方案2】:

如果您注意到,在您的 API 代码中,您需要一个整数,但您传递的是一个逗号分隔的数字(它是一个字符串)

[HttpDelete("id:int")]
public async Task<ActionResult> Delete(int id)

一种选择是将int 更改为string 并在控制器代码中进行字符串拆分。

public async Task<ActionResult> Delete(string ids)

  // split ids into array of int values. "1,2" into [1,2] using string.split

【讨论】:

ids = null。这是前端尝试发送到的 URL localhost:5001/api/Rooms?id=9,10。另请注意,我只能发送localhost:5001/api/Rooms?id=9

以上是关于ASP.NET Core - 尝试创建一个按 ID 删除多条记录的端点的主要内容,如果未能解决你的问题,请参考以下文章

在 2 个控制器 ASP.NET Core 3.1 MVC 之间传递 ID

具有多个路由参数的 ASP.NET Core Razor 页面层次结构

如何在 ASP NET CORE 3.0 中获取当前登录的用户 ID?

在 asp.net core 中插入/更新记录时出错

ASP.NET Core AWS Cognito JWT

如何创建不依赖于 ASP.NET Core 声明的自定义 Authorize 属性?