BindAttribute在ASP.Net MVC Core(2.0.8)中似乎不起作用

时间:2018-07-02 20:05:08

标签: c# asp.net-core-mvc

我正在尝试使用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”仍然会被分配一个值。

我做错什么了吗?

3 个答案:

答案 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/8005https://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}");
}