#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. Вау, работает как шарм. Знаете ли вы, почему вспомогательные теги разрабатываются таким образом?