ASP.NET Core TagHelper ввод asp-для отображения значения атрибут привязывается к исходному значению в модели запроса

#asp.net-mvc #asp.net-core #model-binding #tag-helpers #asp.net-core-tag-helpers

#asp.net-mvc #asp.net-core #привязка к модели #помощники тегов #asp.net-core-tag-helpers

Вопрос:

Я создаю простую веб-страницу с asp.net ядро 3.1 для воспроизведения проблемы. В одном и том же есть 2 действия HomeController.cs .

один для рендеринга HTML-формы, другой для получения post-данных формы, а затем для повторного отображения формы.

 public class HomeController : Controller
{
        // rendering form
        [HttpGet]
        public IActionResult Index()
        {
            var myForm = new MyForm();
            myForm.Id = 100;
            return View("index", myForm);
        }

        // after form post, rendering form with updated value.
        [HttpPost]
        public IActionResult Index(MyForm m)
        {
            m.Id = 200;
            return View("index", m);
        }
}
  

Я использую asp.net помощник по основным тегам в index.cshtml

 @model MyForm

<div>
    <form asp-controller="Home" asp-action="Index" method="post">
        <span>@Model.Id</span>
        <input type="text" asp-for="@Model.Id"/>
        <button type="submit">Submit</button>
    </form>
</div>
  

Когда я ПОЛУЧАЮ /index, все в порядке, как @Model .Идентификатор в диапазоне и входное значение равны 100

Http-ответ для Get / index

 <form method="post" action="/">
        <span>100</span>
        <input type="text" data-val="true" 
               data-val-required="The Id field is required."
               id="Id" name="Id" value="100">
        <button type="submit">Submit</button>
</form>
  

Но когда я отправляю форму, я ожидал, что значение в диапазоне и вводе должно быть 200, но оно равно 200 в диапазоне и 100 в форме

Http-ответ для POST / index с вводом 100

 <form method="post" action="/">
        <span>200</span>
        <input type="text" data-val="true" 
               data-val-required="The Id field is required."
               id="Id" name="Id" value="100">
        <button type="submit">Submit</button>
</form>
  

Я предполагаю, что «asp-for» выбирает чтение данных из исходного состояния модели, которое создается во время привязки модели. Вместо чтения ViewModel передается для рендеринга view Razor.

Кто-нибудь знает, почему asp-for такое поведение помощника тега? Как мне избежать такого поведения и asp-for использовать модель, которую я передал в представлении («индекс», m)

Ответ №1:

Я предполагаю, что «asp-for» выбирает чтение данных из исходного состояния модели

Да, это сделано специально. По умолчанию TagHelper отображает значение ModelState, а не Model.

Если вы хотите asp-for отобразить обновленное значение модели, вы можете добавить ModelState.Clear(); в свое действие post.

 public IActionResult Index(MyForm m)
{
    ModelState.Clear();
    m.Id = 200;
    return View("index", m);
}
  

Комментарии:

1. Вау, работает как шарм. Знаете ли вы, почему вспомогательные теги разрабатываются таким образом?