【发布时间】:2018-09-02 09:22:50
【问题描述】:
我已经为此苦苦挣扎了一段时间,我正在尝试将客户端 JSON 帖子绑定到 ASP.NET Core 2 MVC 中的模型,但我无法获取要采用的值。我发布的 JSON 数据如下。
{
"$type": "Namespace.ApplicationLoggingModel, Projectname.Web",
"Test": "works"
}
...和模型:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Namespace.Models
{
public class ApplicationLoggingModel
{
public string Test { get; set; }
}
}
控制器动作似乎知道它是ApplicationLoggingModel 类,但它不会绑定测试数据。我也尝试过下面的 JSON,但这也不起作用。
{
"$Type": "Namespace.ApplicationLoggingModel, Projectname.Web",
"$Values": [{
"$Type": "System.String, mscorlib",
"Test": true
}]
}
我也尝试过“$type”和“$values”,但它似乎不区分大小写,所以我有点卡住了。这在 .NET Core 和模型绑定中是否可行?我不得不更改项目和命名空间名称,如果您需要更多信息,请告诉我。
更新:我在下面添加了控制器操作,尝试了常规模型绑定后,似乎 $type 不起作用,因为我已经添加了 [FromBody] 标记以使常规模型绑定工作。该模型现在正在通过 null。
[HttpPost("Save/{id}")]
public ActionResult Save(Guid id, [FromBody]ApplicationLoggingModel model)
{
return RedirectToAction("Entities", Guid.Empty);
}
编辑:正如 dbc 正确指出的那样,我的 ApplicationLoggingModel 不是多态的,因此不需要 TypeNameHandling - ApplicationLoggingModel 将包含一组多态模型,我基本上已经退后一步尝试让一个这样工作在我可以在其他模型上实现它之前。
【问题讨论】:
-
既然你的
ApplicationLoggingModel不是多态的,为什么你还需要TypeNameHandling?这样做可能会带来安全风险,请参阅例如How to configure Json.NET to create a vulnerable web API 和 TypeNameHandling caution in Newtonsoft Json. -
它将包含一组多态模型,我基本上已经退后一步尝试让一个组件工作,然后才能在其他模型上实现它。我将编辑我的帖子以指出这一点。
-
然后,奇怪的是,前面提到的How to configure Json.NET to create a vulnerable web API 似乎展示了如何使其工作。在该示例中,存在多态属性而不是多态根模型。另外,启动时需要配置
options.SerializerSettings.TypeNameHandling。 -
顺便问一下,您的多态模型数组中的模型是否派生自某个公共基类或接口?
-
它们派生自一个抽象类,我还没有看到这部分是否有效,它是由另一个开发人员编写的。还要感谢您的文章,将 options.SerializerSettings.TypeNameHandling = TypeNameHandling.All 添加到 AddJsonOptions 已解决了该问题。我必须解决安全问题,因为我很确定这个功能不是我可以解决的
标签: c# json asp.net-core