c# - Controller 和 ControllerBase 之间的模型绑定行为与 [ApiController] 不同
问题描述
我使用asp dotnet core V6(即预览版)。
我有两种相同的方法,一种在 MVC 控制器中,另一种在 Api 控制器中。方法的签名是:
对于 MVC
public async Task<ActionResult> Variable(Models.DTParameters dtp)
用于 api
[HttpGet]
[Consumes("application/x-www-form-urlencoded")]
[Route("api/Select/Variable")]
public async Task<ActionResult> Variable([FromQuery] Models.DTParameters dtp)
这些方法由 jquery 调用$.ajax
对于 MVC:
{
method: 'POST',
url: '/Select/Variable'
}
对于 API:
{
method: 'GET',
url: '/api/Select/Variable'
}
MVC | api |
---|---|
一切皆好 | 只有简单的属性(draw、start、length)被绑定。其他的(search...)为空。 |
如果我尝试使用method='POST' and [FromBody] ,我会以错误结束:“不支持的媒体类型” |
关于如何正确绑定 ApiController 的任何想法DTParameters
?
----- 编辑 1
如果我从我的 api 控制器中删除 [ApiController] 属性,它会起作用:
//[ApiController]
public class SelectController : ControllerBase
对于我的 mvc 控制器,声明是:
public class SelectController : Controller
----- 编辑 2
使用 [ApiController] 和以下声明:
[HttpPost]
[Consumes("application/json")]
[Route("api/Select/Variable")]
public async Task<ActionResult> Variable(Models.DTParameters dtp)
我现在收到错误 400:
{"type":"https://tools.ietf.org/html/rfc7231#section-6.5.1","title":"出现一个或多个验证错误。","status":400,"traceId" :"00-9753afa4b5fc5ed24f3605c3edd51d8e-25872b0ff804e179-00","errors":{"$.order[0].dir":["JSON值无法转换为adapter.wgui.Models.DTOrderDir。路径:$.order [0].dir | LineNumber: 0 | BytePositionInLine: 151."]}}
其中位置值 151 对应于最后一个 c 之后的 "
"order":[{"column":0,"dir":"asc"}]
似乎活页夹无法处理 DTOrderDir 枚举。
----- 附件
其中 DTParmeters 是:
public class DTParameters {
public int Draw { get; set; }
public DTColumn[] Columns { get; set; }
public DTOrder[] Order { get; set; }
public int Start { get; set; }
public int Length { get; set; }
public DTSearch Search { get; set; }
public DTKeyValue[] MoreForSearch { get; set; }
}
public class DTKeyValue {
public string Key { get; set; }
public string Value { get; set; }
}
public class DTColumn {
public string Data { get; set; }
public string Name { get; set; }
public bool Searchable { get; set; }
public bool Orderable { get; set; }
public DTSearch Search { get; set; }
}
public class DTOrder {
public int Column { get; set; }
public DTOrderDir Dir { get; set; }
}
public enum DTOrderDir {
asc,
desc
}
public class DTSearch {
public string Value { get; set; }
public bool Regex { get; set; }
}
解决方案
只需修复动作属性。删除除 Route 之外的所有属性
mvc
[Route("~/Select/Variable")]
public async Task<ActionResult> Variable(Models.DTParameters dtp)
api
[Route("~/api/Select/Variable")]
public async Task<ActionResult> Variable( Models.DTParameters dtp)
并修复 ajax
mvc
{
method: 'POST',
url: '/Select/Variable'
}
api
{
method: 'POST',
url: '/Select/Variable'
}
如果您没有 [ApiController] 属性,请将此属性用于 API
{
method: 'POST',
url: '/Api/Select/Variable'
}
推荐阅读
- javascript - 如何使用 React 中的 Hooks 在带有汉堡菜单的标题中切换侧边栏组件
- liferay - Liferay portal-ext.properties 文件中启用的语言设置似乎不起作用
- python - Python:YYYY-MM-DDTHH:MM:SS 的 date.time strptime 格式?
- exception - 构建 Xamarin.iOS 时没有名为“NFCVASReaderSessionDelegate”的类型或协议
- upgrade - 超集从 0.38 升级到 1.0.1
- javafx - 将程序导出到 jar 文件时,JFXDatePicker 不起作用
- ansible - 如何在 AWX 中为库存脚本存储和检索秘密?
- node.js - 如何使用 http-proxy 和 Harmonon 将脚本标记注入 HTML 正文
- django - Django Rest-Framework-Simplejwt 不适用于 modheader
- python - 感知器神经网络不会学习特定范围内的值