首页 > 解决方案 > 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; }
}

标签: c#asp.net-mvcasp.net-coreasp.net-web-api.net-core

解决方案


只需修复动作属性。删除除 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'
}

推荐阅读