ASP.NET Core API后期操作始终具有无效的ModelState

时间:2017-02-15 21:55:55

标签: asp.net-core asp.net-core-webapi

我有一个.net核心webapi项目,它在控制器上有一个POST动作,它有一个(n模糊的)签名,如:

    [Route("person/{Id}/media")]
    [HttpPost]
    public IActionResult Post([FromBody]Media media, Guid Id)

Media是一个抽象类,表示BookMedia或MovieMedia的基类。当我通过postman调用该方法时,media为null,输出窗口显示以下消息:

    Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker: Information: Executing action method OurApp.Api.Data.Controllers.MediaController.Post (OurApp.Api.Data) with arguments (, 7c39c945-d0a5-433f-98bd-e044f4b87723) - ModelState is Invalid

Media类使用JsonConverter进行修饰,该JsonConverter成功执行其功能,返回正确具体类的Target对象,无论发送哪种类型的Json。

模型对象看起来像这样。

Abstract Class Media
+ MediaId
+ PersonId
+ virtual Person
+ Title
+ CreatedDate_Internal
+ ModifiedDate_Internal
+ Deleted_Internal

Class BookMedia
+ NumberOfPages
+ AuthorName
+ CreatedDate_Internal
+ ModifiedDate_Internal
+ Deleted_Internal

Class MovieMedia
+ Length
+ DirectorName
+ CreatedDate_Internal
+ ModifiedDate_Internal
+ Deleted_Internal

在此过程中,在JsonConverter的返回和Post方法的开始之间,我们丢失了新的媒体对象,并且声明我们的ModelState是无效的。

ModelState似乎不是ControllerAction中的有效对象,所以我甚至没有办法查看ModelState错误是什么?

注释掉JsonConverter属性,绕过转换器没有实质性的影响;媒体对象保持为空。

如何解决此问题?

编辑1

更新了与路线匹配的操作方法签名。

编辑2 - 添加模型对象

我开始怀疑两件事......我的模型中的_Internal字段的(临时)重复,这些将很快从我们的模型中删除。该项目使用额外的位进行编译,但也许会丢掉模型验证。

第二件事是“虚拟”人。我没有传递它,也没有在创建时用JsonConverter填充它。

编辑3 - 解决方案

我修复了重复的_Internal字段,并解决了导致我的ModelState对象丢失的问题(不知何故,我忽略了从控制器派生!)。然而,这些并没有解决主要问题。

问题原来是输入Json。事实上,“MediaId”字段。我已经将null传递给它了,作为一个实验,我传递了一个真正的价值,突然间,我有数据流过。

0 个答案:

没有答案