【问题标题】:GET json nested object attribute. [FromQuery]GET json 嵌套对象属性。 [来自查询]
【发布时间】:2019-12-06 21:27:11
【问题描述】:

我正在尝试查询“UserType”对象,并获取属性“name” 所以整个 JSON 对象是 User: 并且 api 调用应该是这样的: api/user?userTypeName=randomUserTypeName

我可以在其中搜索特定的 userTypeName,并返回名称。

API 调用:

这里我想使用 FromQuery,以便能够搜索 userTypeName 并检查 userTypeName 是否等于输入的名称。

// GET: /api/User/userTypeName
[HttpGet("{userTypeName}")]
public async Task<ActionResult<IEnumerable<User>>> GetAsync(([FromQuery(Name = "userTypeName")]string userTypeName) {
    var result = await ctx.User
        .Include(x => x.UserType)
        .Where(x => x.UserType.Name.ToLower() == UserTypeName.ToLower())
        .ToListAsync();

    if (result == null) return BadRequest();

    return result;
}

对象如下所示:

{
    "id": 9,
    "userTypeId": 1,
    "userType": {
    "id": 1,
    "name": "randomUserTypeName",
    "users": 
    [
        {
            "id": 11,
            "userTypeId": 1,
            "userUrl": "https://userurl",
            "username": "eee",
            "password": "eee",
        }
    ]
}

【问题讨论】:

    标签: c# entity-framework asp.net-core-webapi asp.net-apicontroller


    【解决方案1】:

    如果你想通过/api/User/userTypeName这样的请求从Route访问userTypeName,你的操作应该是这样的

    [HttpGet("{userTypeName}")]
    public async Task<ActionResult<IEnumerable<User>>> GetAsync(string userTypeName) {
        var result = await ctx.User
            .Include(x => x.UserType)
            .Where(x => x.UserType.Name.ToLower() == UserTypeName.ToLower())
            .ToListAsync();
    
        if (result == null) return BadRequest();
    
        return result;
    }
    

    如果你想从查询中访问userTypeName api/user?userTypeName=randomUserTypeName,你的操作应该是这样的

    [HttpGet]
    public async Task<ActionResult<IEnumerable<User>>> GetAsync([FromQuery(Name = "userTypeName")]string userTypeName) {
        var result = await ctx.User
            .Include(x => x.UserType)
            .Where(x => x.UserType.Name.ToLower() == UserTypeName.ToLower())
            .ToListAsync();
    
        if (result == null) return BadRequest();
    
        return result;
    }
    

    【讨论】:

    • 它不会让我在不定义 ("{userTypeName}") 属性的情况下使用 [HttpGet]。我已经有一个 GetAsync 方法,仅用于获取用户。这种冲突是否以某种方式发生?
    • @Langehk 你使用{userTypeName}FromQuery的原因是什么?
    • 我只是想查询 userTypeName。如果我不使用 {userTypeName} 它会给我一个错误。
    • 处理请求时发生未处理的异常。 AmbiguousMatchException:请求匹配多个端点。匹配项:` Proj.Presentation.MVC.API.UserController.GetAsync (Proj.Presentation.MVC) Proj.Presentation.MVC.API.UserController.GetAsync (proj.Presentation.MVC) /_Host `
    • @Langehk 这是因为您使用HttpGet 进行多项操作。将[HttpGet("{userTypeName}")] 更改为[HttpGet("[action]")]
    猜你喜欢
    • 1970-01-01
    • 2013-03-18
    • 2019-05-05
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 2022-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多