У меня возникли проблемы с привязкой модели в ASP.NET Core . По сути, я просто пытаюсь связать некоторые POST-файлы JSON с объектной моделью с вложенными свойствами. Ниже приведен минимальный код для одной кнопки, которая при нажатии будет отправлять POST в метод действия Controller через XMLHttpRequest. Метод действия принимает один параметр класса модели с атрибутом [FromBody]
.
Модель:
public class OuterModel {
public string OuterString { get; set; }
public int OuterInt { get; set; }
public InnerModel Inner { get; set; }
}
public class InnerModel {
public string InnerString { get; set; }
public int InnerInt { get; set; }
}
Контроллер:
using Microsoft.AspNetCore.Mvc;
public class HomeController : Controller {
[HttpPost("models/")]
public IActionResult Save([FromBody] OuterModel viewModel) {
if (!ModelState.IsValid)
return BadRequest(ModelState);
// Return an appropriate response
return Ok();
}
}
Разметка бритвы для кнопки "Отправить":
<div class="form-row">
<div class="col-2">
@{ string url = Url.Action(nameof(HomeController.Save), "Home"); }
<button id="post-btn" data-post-url="@url">POST</button>
</div>
</div>
JavaScript для отправки (НЕ связывает):
document.getElementById("post-btn").addEventListener("click", e => {
const xhr = new XMLHttpRequest();
xhr.addEventListener("timeout", () => console.error("Timeout"));
xhr.addEventListener("error", () => console.error("Error"));
xhr.addEventListener("load", () => console.log(`Status: ${xhr.status} ${xhr.statusText}`));
xhr.open("POST", e.target.dataset.postUrl);
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xhr.send(JSON.stringify({
"OuterString": "outer",
"OuterInt": 1,
"Inner.InnerString": "inner",
"Inner.InnerInt": 5
}));
});
Глядя на этот JavaScript, я ожидаю, что имена свойств Inner.*
json будут правильно привязаны, учитывая эту строку из документов :
Привязка модели ищет шаблон имя_параметра.property_name для привязки значений к свойствам. Если он не находит совпадающие значения этой формы, он попытается выполнить привязку, используя только имя свойства.
Но это не так; свойство OuterModel.Inner
в методе действия заканчивается null
. Однако следующий json правильно связывает :
JavaScript для отправки (связывает):
xhr.send(JSON.stringify({
"OuterString": "outer",
"OuterInt": 1,
"Inner": {
"InnerString": "inner",
"InnerInt": 5
}
}));
Так что я могу использовать этот код для достижения связывания модели, в котором я нуждаюсь, я просто не понимаю, почему первый JavaScript не работал . Разве я не использовал правильное соглашение об именах для вложенных свойств? Некоторые разъяснения будут высоко оценены!