我有以下控制器动作
[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
}
阅读完源代码后,在请求正文中发布json时,将BodyModelBinder
使用。不幸的是,此模型绑定程序似乎未应用IPropertyBindingPredicateProvider
like[Bind]
属性实例提供的PropertyFilters 。
它只是使用将JsonInputFormatter
json反序列化为模型类型:
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对象:)
当然,在这种情况下更难,因为您有一个动态对象而不是强类型对象,这意味着:
您可以探索更新JsonSerializerSettings
,例如尝试使用合同解析器动态排除属性。您可能需要一些全局配置来链接要忽略的路由和参数,因此您可以根据当前请求决定何时忽略属性。
如果它是由Microsoft修复的,那么所有这些都将变得更加容易,因为它开箱即用!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句