Asp.Net 核心 MVC - 复杂模型未绑定到获取控制器操作

Asp.Net Core MVC - Complex Model not binding on Get Controller action

我的 View 和 Controller 之间某处不匹配,这导致后者接收到一个充满空值的复杂对象。

[HttpGet("find")]
[ProducesResponseType(typeof(PagableResults<UserDetails>), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[SwaggerOperation("FindUsers")]
public async Task<IActionResult> FindUsers([FromQuery]FindUsersSearchFilter searchFilters)

searchFilters 对象定义如下:

public class FindUsersSearchFilter
{
    public int? Page { get; set; }

    public string Username { get; set; }

    public string Firstname { get; set; }

    public string Surname { get; set; }
}

视图正在查询字符串中发送数据(因为它是一个 get 方法),如下所示:

/find?SearchFilters.Page=1&SearchFilters.Firstname=foo&SearchFilters.Surname=bar&SearchFilters.Username=

但是,如果您调试控制器操作,则会命中断点,但该方法收到的 FindUsersSearchFilter 对于每个 属性.

都有一个空值

我尝试过的事情:

不知道下一步该去哪里。关于我的错误有什么建议吗?

请求错误。应该是:

/find?Page=1&Firstname=foo&Surname=bar&Username=

当您使用 SearchFilters 作为所有属性的前缀时,绑定引擎很可能会寻找嵌套的 属性,例如 searchFilters.SearchFilters.FirstName.

所以删除前缀应该可以正常工作。

如果您确实需要在查询中使用该语法;然后像这样创建另一个 class:

public class SearchFilterContainer
{
    public FindUsersSearchFilter SearchFilters { get; set; } = new FindUsersSearchFilter();
}

并将其作为参数传递到操作中,而不是像这样:

[HttpGet("find")]
[ProducesResponseType(typeof(PagableResults<UserDetails>), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[SwaggerOperation("FindUsers")]
public async Task<IActionResult> FindUsers([FromQuery]SearchFilterContainer searchFilters)

然后在您的控制器中,您可以像这样访问模型 searchFilters.SearchFilters.FirstName