我一直试图让this链接的示例工作。
我试图检测json请求中的额外字段,如果存在则返回错误。
以下是我所拥有的:
ApiController:
public class MyClassController : ApiController
{
public IHttpActionResult Add(MyClass myClass)
{
if (myClass.ContainsExtra)
{
return BadRequest(ModelState);
}
...
}
...
}
DynamicObject:
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方法应该触发,它应该将bool ContainsExtra设置为true,以便可以在MyClassController上的Add方法中进行评估。当它包含额外的字段时,它应该向客户端返回错误。
不幸的是,我似乎无法解雇TrySetMember。
我想念的是什么?
答案 0 :(得分:3)
我通过简单地将JSONMediaTypeFormatter的MissingMemberHandling设置设置为MissingMemberHandling.Error获得了我想要的功能,在我的情况下我:
<强> WebConfigFile:强>
// Set up The Json Media Type Formatter
var JsonMTF = new JsonMediaTypeFormatter
{
SerializerSettings = { MissingMemberHandling = MissingMemberHandling.Error }
};
// Clear all formatters
config.Formatters.Clear();
// Add the JSON formatter
config.Formatters.Add(JsonMTF);
然后编写一个ActionFilterAttribute:
public class ValidateModelFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext filterContext)
{
if (!filterContext.ModelState.IsValid)
{
filterContext.Response = filterContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, filterContext.ModelState);
}
}
}
最后在 WebConfigFile :
中添加过滤器// Add Validate Model Filter Attribute
config.Filters.Add(new ValidateModelFilterAttribute());