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 对于每个 属性.
都有一个空值
我尝试过的事情:
- 在控制器操作上绑定(前缀="SearchFilters")。
- 在控制器操作上绑定("Page,Firstname,Surname,Username")
- 手动更改 URL 以删除前缀并更改大小写
- 正在删除 [FromQuery]
不知道下一步该去哪里。关于我的错误有什么建议吗?
请求错误。应该是:
/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
我的 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 对于每个 属性.
都有一个空值我尝试过的事情:
- 在控制器操作上绑定(前缀="SearchFilters")。
- 在控制器操作上绑定("Page,Firstname,Surname,Username")
- 手动更改 URL 以删除前缀并更改大小写
- 正在删除 [FromQuery]
不知道下一步该去哪里。关于我的错误有什么建议吗?
请求错误。应该是:
/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