【发布时间】:2014-07-04 00:39:06
【问题描述】:
我一直在尝试从 this 链接中获取示例。
我正在尝试检测 json 请求中的额外字段,如果存在则返回错误。
这是我所拥有的:
ApiController:
public class MyClassController : ApiController
{
public IHttpActionResult Add(MyClass myClass)
{
if (myClass.ContainsExtra)
{
return BadRequest(ModelState);
}
...
}
...
}
动态对象:
public class MyClass : DynamicObject
{
private Dictionary<string, object> fields =
new Dictionary<string, object>(
StringComparer.OrdinalIgnoreCase);
[Required]
public string FirstName { get; set; }
[Required]
public string LastName { get; set; }
public bool ContainsExtra { get; private set; }
[JsonIgnore]
public Dictionary<string, object> Extra
{
get { return fields; }
}
public override bool TryGetMember(GetMemberBinder binder,
out object value)
{
return fields.TryGetValue(binder.Name, out value);
}
public override bool TrySetMember(SetMemberBinder binder,
object value)
{
this.ContainsExtra = true;
fields[binder.Name] = value;
return true;
}
}
如果我从 Fiddler 发送这个 Json
{“FirstName”:”Test”, “LastName”:”Test”, “City”:”New York”}
TrySetMember 方法应该被触发,它应该将布尔值 ContainsExtra 设置为 true,以便可以在 MyClassController 上的 Add 方法中对其进行评估。当它确实包含一个额外的字段时,它应该向客户端返回一个错误。
不幸的是,我似乎无法触发 TrySetMember。
我错过了什么?
【问题讨论】:
-
不是答案,只是想accessing properties like this example 和“验证”这种方式会更简单吗?
-
我找到了一个 SerializerSetting "MissingMemberHandling",默认设置为 Ignore,我所做的是:
-
var jsonFormatter = config.Formatters.OfType
().ElementAtOrDefault(1); jsonFormatter.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Error; -
现在它设置 ModelState.IsValid == false 当有一个额外的字段时,我可以将 ModelState 返回给客户端。唯一的问题是我想不出一种方法让它为类使用不同的名称 { "Message":"The request is invalid.", "ModelState":{ "myClass.City":[ "Could not find member 'myClass' 类型的对象上的 'City'。路径 'City',第 1 行,位置 16。 ] } }