Ошибка привязки модели ядра MVC ASP.NET? - PullRequest
0 голосов
/ 09 сентября 2018

У меня возникли проблемы с привязкой модели в 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 не работал . Разве я не использовал правильное соглашение об именах для вложенных свойств? Некоторые разъяснения будут высоко оценены!

...