Asp.Net Core MVC-复杂模型在“获取控制器”操作上未绑定

在我的视图和控制器之间某处不匹配,这导致后者接收到一个复杂的对象,该对象充满了空值。

[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的每个属性都为空值。

我尝试过的事情:

  • 在控制器操作上绑定(Prefix =“ SearchFilters”)。
  • 在控制器操作上绑定(“ Page,Firstname,Surname,username”)
  • 手动更改网址以删除前缀并更改大小写
  • 删除[FromQuery]

不知所措,下一步该去哪里。关于我错了什么建议吗?

ergasfgsafg 回答:Asp.Net Core MVC-复杂模型在“获取控制器”操作上未绑定

请求是错误的。应该是:

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

在为所有属性添加SearchFilters前缀时,绑定引擎很可能会寻找嵌套的属性,例如searchFilters.SearchFilters.FirstName。

因此,删除前缀应使其起作用。

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

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

访问模型
本文链接:https://www.f2er.com/3158670.html

大家都在问