ASP.NET Core提供了数据绑定功能来自动将请求参数绑定到相应的模型属性中。但是,如果请求中包含非法数据,绑定操作会失败并返回400错误。在某些情况下,我们希望能够部分绑定有效的数据并忽略无效数据,以便在模型验证之前处理数据并进行一些自定义逻辑。下面给出一个包含代码示例的解决方法。
首先,在Controller的Action方法中使用[FromBody]属性声明一个参数来接收Json请求体,并使用ModelStateDictionary对象手动执行部分验证和绑定操作。以下是示例代码:
[HttpPost]
public IActionResult PartialBinding([FromBody] JObject requestBody)
{
var viewModel = new MyViewModel();
//手动绑定ID属性
if(requestBody.ContainsKey("id"))
{
if(int.TryParse(requestBody["id"].ToString(), out int id))
{
viewModel.ID = id;
}
else
{
ModelState.AddModelError("ID", "Invalid ID value");
}
}
//手动绑定Name属性
if(requestBody.ContainsKey("name"))
{
viewModel.Name = requestBody["name"].ToString();
}
//手动验证模型
if(!ModelState.IsValid)
{
return BadRequest(ModelState);
}
//进行自定义逻辑...
return Ok(viewModel);
}
在上面的示例中,我们首先手动绑定ID和Name属性,并根据需要手动验证模型。 如果模型验证失败,则返回BadRequest请求。 如果模型验证成功,则可以在Action方法中进行任何自定义逻辑并返回200 OK响应。
需要注意的是,此方法需要手动绑定和验证每个需要绑定的属性,因此适用于只有少数需要绑定的属性的情况。 对于大型模型和需要绑定的大量属性的情况,应使用默认的数据绑定方式。