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

问题描述 投票:0回答:1

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

[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; }
}

View像这样发送查询字符串中的数据(因为它是一个get方法):

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

但是,如果您调试控制器操作,则会命中断点,但是该方法接收的FindUsersSearchFilter对于每个属性都具有空值。

我尝试过的事情:

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

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

c# asp.net-mvc asp.net-core model-binding
1个回答
2
投票

请求是错误的。应该是:

/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来访问模型>

© www.soinside.com 2019 - 2024. All rights reserved.