删除ASP MVC WebApi Action Method中的json字段

时间:2017-08-08 07:07:33

标签: asp.net json asp.net-mvc asp.net-web-api model-binding

我有一个接受模型UpdateProductCommand的控制器,如下所示:

public IHttpActionResult UpdateProduct(UpdateProductCommand command)
{
    command.AuditUserName = this.RequestContext.Principal.Identity.Name;
    // ....
}

对于安全问题,永远不应将AuditUserName字段设置在外部(来自API调用)。

如何从JSON请求中删除(或截断)此字段的值?

2 个答案:

答案 0 :(得分:0)

可以通过以下ModelBinder

来实现
using Newtonsoft.Json.Linq;

public class FieldRemoverModelBinder : IModelBinder
{
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
    {
        string content = actionContext.Request.Content.ReadAsStringAsync().Result;
        JObject json = JObject.Parse(content);
        JToken property = json.GetValue(bindingContext.ModelName, StringComparison.OrdinalIgnoreCase);
        property?.Parent.Remove();
        bindingContext.Model = json.ToObject(bindingContext.ModelType);

        return true;
    }
}

像这样使用:

public IHttpActionResult UpdateProduct(([ModelBinder(typeof(FieldRemoverModelBinder), Name = nameof(UpdateProductCommand.AuditUserName))]UpdateProductCommand command)
{
    // here command.AuditUserName will always be empty, no matter what's in json

答案 1 :(得分:0)

这是DTO的用途。

您可以创建另一个类(例如UpdateProductCommandDto),它只包含您需要/想要用作输入的属性,然后您可以使用Automapper之类的内容来映射它到UpdateProductCommand的新实例。