BindAttribute не работает в ASP.Net MVC Core (2.0.8) - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь использовать атрибут 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] прямо перед параметром метода контроллера, но он не работает.

Итак, проблема, с которой я сталкиваюсь, заключается в том, что «Два» по-прежнему получает значение, даже если я прямо сказал, что хочу, чтобы «Один» был связан.

Я что-то не так делаю?

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Кажется, [Bind] не работает для JSON, так что нет способа обойти это, по крайней мере, в моем случае использования.

См .: https://github.com/aspnet/Mvc/issues/8005 и https://github.com/aspnet/Mvc/issues/5731

0 голосов
/ 06 ноября 2018

Кажется, что 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}");
}
0 голосов
/ 03 июля 2018

Атрибут [Bind] должен быть в параметре. Вы не можете определить это на уровне класса. Причина, по которой предложение @ Nkosi провалилось, заключается в том, что вам все еще нужно [FromBody], так как вы публикуете JSON. Другими словами:

[HttpPost("foo")]
[Consumes("application/json")]
public IActionResult Foo([FromBody][Bind("One")] SomeModel model)
{
    return Json(model);
}

FWIW, кто бы ни настраивал ваш статический анализ, он придурок и должен называться таковым, многократно и энергично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...