混合Bind和FromBody属性MVC 6

吉米沙尔

我有以下控制器动作

[HttpPut("{id}")]
public void Put(int id, [Bind("BirthDate")][FromBody]ExpandoObject value)
{
   _dataContext.Update(value);
}

我正在尝试限制允许的属性,并且我认为这会起作用,但是,它不起作用,并且值接收所有发送的值,而不仅仅是BirthDate-我不想使用视图模型,因为我想要一个动态对象被发送。仅供参考,这也不适用于普通模型对象。

这是我在请求正文中发送的json

{
      "FirstName": "Lionell",
      "LastName": "Messi",
      "BirthDate": "2009-04-06T11:54:29.047",
      "PhoneNumber": "1234567890",
      "EmailAddress": "[email protected]",
      "SchoolId": 1,
      "IsIndependent": true
}
丹尼尔·JG

阅读完源代码后,在请求正文中发布json时,将BodyModelBinder使用。不幸的是,此模型绑定程序似乎未应用IPropertyBindingPredicateProviderlike[Bind]属性实例提供的PropertyFilters

它只是使用将JsonInputFormatterjson反序列化为模型类型:

var formatters = bindingContext.OperationBindingContext.InputFormatters;
var formatter = formatters.FirstOrDefault(f => f.CanRead(formatterContext));

...

try
{
    var previousCount = bindingContext.ModelState.ErrorCount;
    var result = await formatter.ReadAsync(formatterContext);
    var model = result.Model;

对我来说这似乎是个虫子...

同时,您可以尝试评估一些可用的选项。文档所述,我们知道格式化程序使用Json.Net:

JsonInputFormatter是默认的格式,它是基于Json.NET的关闭。

因此,从本质上讲,您将需要采用一种方法来排除与Json.Net一起使用的[JsonIgnore]属性,例如使用属性。(或者只使用一些不包含这些属性的DTO对象:)

当然,在这种情况下更难,因为您有一个动态对象而不是强类型对象,这意味着:

  1. 没有可以应用属性的类型
  2. Json.net将不知道您在控制器操作中设置的任何属性。

您可以探索更新JsonSerializerSettings,例如尝试使用合同解析器动态排除属性。您可能需要一些全局配置来链接要忽略的路由和参数,因此您可以根据当前请求决定何时忽略属性。

如果它是由Microsoft修复的,那么所有这些都将变得更加容易,因为它开箱即用!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章