我正在尝试使用Bind属性在模型中仅包括特定属性。我知道我可以使用视图模型并仅指定所需的属性,但是我不能使用它,因为代码必须经过一些静态代码分析才能运行,如果不存在Bind属性,则该触发器会触发错误,并且我可以不能更改该规则(不受我控制)。
这就是我尝试过的。
型号:
[Bind("One")]
public class SomeModel
{
public int One { get; set; }
public int Two { get; set; }
}
控制器方法:
[HttpPost("foo")]
[Consumes("application/json")]
public IActionResult Foo([FromBody] SomeModel model)
{
return Json(model);
}
我在POST中发送的内容:
{
"One": 1,
"Two": 2
}
我得到的答复:
{
"One": 1,
"Two": 2
}
我还尝试将[Bind]
属性放在控制器方法参数之前,但这不起作用。
所以,我遇到的问题是,即使我明确告诉我只希望将“ One”绑定,“ Two”仍然会被分配一个值。
我做错什么了吗?
答案 0 :(得分:0)
[Bind]
属性必须在参数上。您不能在课程级别定义它。 @Nkosi的建议失败的原因是,由于要发布JSON,因此您仍然还需要[FromBody]
。换句话说:
[HttpPost("foo")]
[Consumes("application/json")]
public IActionResult Foo([FromBody][Bind("One")] SomeModel model)
{
return Json(model);
}
FWIW,无论您设置了静态分析的人都是白痴,都应该被这样反复地,充满活力地称呼。
答案 1 :(得分:0)
[Bind]
似乎不适用于JSON,因此,至少在我的用例中,无法解决此问题。
请参阅:https://github.com/aspnet/Mvc/issues/8005和https://github.com/aspnet/Mvc/issues/5731
答案 2 :(得分:0)
当模型通过请求中的主体传递模型时,BindAttribute
似乎无法按预期工作。
通过QueryString传递它时,它将按预期工作。
您可以使用以下示例代码对此进行测试:
这是模型:
[Bind(include: nameof(MinX))]
public class ValueModel
{
[JsonProperty("min-x")]
public string MinX { get; set; }
[JsonProperty("min-y")]
public string MinY { get; set; }
}
可以正常使用的API方法:
[HttpGet()]
public ActionResult<string> Get([FromQuery] ValueModel value)
{
return new OkObjectResult($"MinX={value.MinX}; MinY={value.MinY}");
}
[HttpPost]
public ActionResult Post([FromQuery]ValueModel value)
{
return new OkObjectResult($"MinX={value.MinX}; MinY={value.MinY}");
}
无法正常使用的API方法:
[HttpPost]
public ActionResult Post([FromBody]ValueModel value)
{
return new OkObjectResult($"MinX={value.MinX}; MinY={value.MinY}");
}