ASP.NET MVC拒绝其他字段

时间:2019-04-11 06:49:54

标签: c# asp.net-mvc model-binding

在ASP.NET MVC中,我有HTTP方法

exports.update = async (jsonObj, address) => {
  console.log("jsonObj", jsonObj);

  const q = "UPDATE list SET balance = ? WHERE address = ?";
  try {
    await query(q, [jsonObj, address]);
    console.log("Updated", address);
    return "Ok";
  } catch (err) {
    throw err;
  }
};

LoginModel类似于:

[HttpPost]
public JsonResult SampleMethod(LoginModel prmModel)
{

}

如果请求正文中的字段比预期的(用户名和密码)更多,我希望请求失败

如果HTTP请求正文为 public class LoginModel { public string Username { get; set; } public string Password { get; set; } } ,由于我的情况为“虚拟”字段,因此请求应失败。 (异常或错误请求响应)

如何限制MVC Model Binder仅在某些方法上具有这种行为? 此要求并非针对所有方法,也不针对项目中的某些模型。

3 个答案:

答案 0 :(得分:0)

解决方案:

[HttpPost]
public JsonResult SampleMethod()
{
    dynamic prmModel= System.Web.Helpers.Json.Decode((new StreamReader(Request.InputStream).ReadToEnd()));

    Newtonsoft.Json.Schema.JsonSchema schema = JsonSchema.Parse(Jsonschema());
    Newtonsoft.Json.Linq.JObject user = JObject.Parse(Newtonsoft.Json.JsonConvert.SerializeObject(prmModel));
    if (!user.IsValid(schema) || user.Count > 2)
        return Json("Bad Request");
}

public string Jsonschema()
{
    string schemaJson = @"{
        'description': 'A',
        'type': 'object',
        'properties': {
            'UserName':{'type':'string'},
            'Password':{'type':'string'}
            }
        }";

    return schemaJson;
}

答案 1 :(得分:0)

实现此要求的简单方法是选中Request.Form.Keys.Count != 2 or > 2

        if (Request.Form.Keys.Count > 2)
        {
            return View("Error"); // handle error
        }
        else
        {
            // handle logic here
        }

答案 2 :(得分:0)

如果可以使用Newtonsoft.JSON库,则JsonSerializerSettings中有MissingMemberHandling property。您可以使用以下属性编写自定义模型联编程序以从json反序列化对象:

public class StrictJsonBodyModelBinder : IModelBinder
{
    public async Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext.ModelType != typeof(string))
        {
            if (bindingContext.HttpContext.Request.ContentType != "application/json")
            {
                throw new Exception("invalid content type, application/json is expected");
            }

            using (var bodyStreamReader = new StreamReader(bindingContext.HttpContext.Request.Body))
            {
                var jsonBody = await bodyStreamReader.ReadToEndAsync().ConfigureAwait(false);
                var jsonSerializerSettings = new JsonSerializerSettings
                {
                    MissingMemberHandling = MissingMemberHandling.Error,
                };
                var model = JsonConvert.DeserializeObject(jsonBody, bindingContext.ModelType, jsonSerializerSettings);
                bindingContext.Result = ModelBindingResult.Success(model);
            }
        }
    }
}

然后,您可以将此模型联编程序与ModelBinderAttribute一起用于特定的操作参数:

[HttpPost]
public JsonResult SampleMethod([ModelBinder(typeof(StrictJsonBodyModelBinder))] LoginModel prmModel)
{
}

现在,当传递无效属性时,JsonConvert将引发错误(如果不处理错误,将为用户使用HTTP 500)。