Відображення значення, зміненого в дії після публікації форми в поданні
середовище
- Візуальна студія
-
- Візуальна студія 2022
- ASP.NET ядро
-
- 6.0 MVC
Він працює в середовищах, відмінних від наведених вище, але опублікований код був написаний в рамках вище.
Що робити
Спробуйте створити просту програму, яка говорить: "Опублікуйте текст, який ви ввели на екрані, і поверніть оброблений текст на той же екран, що і новий результат".
код
Основою є створення нового проекту MVC, з якого ви додаєте код. Код публікується для загальної конфігурації, тому, будь ласка, зверніться до нього.
Модель (видмодель)
Створіть наступну модель для взаємодії з переглядом і дією: ResultValue
Є два, але я хотів дати два результати в точці зору, тому я підготував два.
ЗразокViewModel
namespace PostValueChange.Models
{
public class SampleViewModel
{
<summary>入力値を受け取るプロパティ。</summary>
public string? InputValue { get; set; }
<summary>結果を出力するプロパティ。</summary>
public string? ResultValue1 { get; set; }
<summary>結果を出力するプロパティ。</summary>
public string? ResultValue2 { get; set; }
}
}
дія
Це простий процес: отримати для відображення подання, взяти текст, введений в POST, обробити його, і повернути результат.
HomeController
// 省略
namespace PostValueChange.Controllers
{
public class HomeController : Controller
{
// 省略
[HttpGet]
public IActionResult Sample() => View();
[HttpPost]
public IActionResult Sample(SampleViewModel model)
{
if (ModelState.IsValid == false) View(model);
model.ResultValue1 = model.InputValue + " テキストを追加1";
model.ResultValue2 = model.InputValue + " テキストを追加2";
return View(model);
}
}
}
вид
Створення подань на основі дій і моделей.
При натисканні ResultValue1
кнопки оновлення, і ResultValue2
відображаються, але вони відображаються в "вхідний текст" і "в div тег", відповідно.
Sample.cshtml
@model PostValueChange.Models.SampleViewModel
@{
ViewData["Title"] = "Sample";
}
<h1>Sample</h1>
<h4>SampleViewModel</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="Sample" >
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="InputValue" class="control-label"></label>
<input asp-for="InputValue" class="form-control" />
<span asp-validation-for="InputValue" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="更新" class="btn btn-primary" />
</div>
<div class="form-group">
<label asp-for="ResultValue1" class="control-label"></label>
<input asp-for="ResultValue1" class="form-control" />
<span asp-validation-for="ResultValue1" class="text-danger"></span>
</div>
<div>@Model?.ResultValue2</div>
</form>
</div>
</div>
<div>
<a asp-action="Index">前の画面に戻る</a>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
Index.cshtml
Додайте посилання, щоб перейти від Sample
переходу до .
Index.cshtml
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
<a asp-action="Sample">Sample</a> @* 追加 *@
Оновлення моделі, отриманої в процесі POST, не впливає на введення виду і т.д.
Запустіть створений вище код, введіть з InputValue
екрана Зразок і спробуйте оновити.
На стороні дії, ResultValue1
оскільки значення налаштовані і ResultValue2
повертаються, передбачається, що обидва спочатку відображаються, але насправді div
відображаються тільки 2, встановлені в тегу.
Значення, встановлене для ModelState, має пріоритет
Коли клієнт POSTs вхідне значення, значення встановлюється на змінну моделі аргументу ControllerBase.ModelState
, але значення також встановлюється.
Введене значення потім перевіряється ModelState
значенням, встановленим на . ModelState.IsValid
Ось чому це судять.
При налагодженні можна перевірити вміст, припинивши обробку в точці зупину.
Якщо спочатку потрібно повернути значення до подання, return View(model);
включити значення , але якщо значення ModelState
має значення , воно має значення ,ModelState
воно має пріоритет і повертається до подання.
ModelState
Оскільки встановлене значення — це значення, надіслане шляхом введення подання тощо, з точки зору InputValue
моделі, ResultValue1
встановлюється .
Таким чином,ResultValue1
значення приймає ModelState
пріоритет, і значення,ModelState
встановлене в моделі, яка не ResultValue2
має значення відображається в поданні.
Повернення значення до подання на користь значення моделі
ModelState
Значення, які мають пріоритет для подання, тому, якщо ModelState
стерти значення, для яких встановлено значення , значення моделі буде повернуто до подання.
ModelState.Clear()
Ви можете стерти всі значення, які мають, зателефонувавши ModelState
наступним чином:
[HttpPost]
public IActionResult Sample(SampleViewModel model)
{
if (ModelState.IsValid == false) View(model);
// ModelState の値を消してモデルの値をビューに返却できるようにする
ModelState.Clear();
// ビューに返す値を設定する
model.ResultValue1 = model.InputValue + " テキストを追加1";
model.ResultValue2 = model.InputValue + " テキストを追加2";
return View(model);
}
ModelState
також виконує процес перевірки,ModelState.Clear
тому обов'язково ModelState.IsValid
прочитайте його після виклику .
Коли ви його запустите, результат буде відображатися правильно наступним чином.
ModelState.Clear
Оскільки всі значення зникають при виклику методу, також можна вказати ім'я властивості моделі і стерти значення окремо наступним чином.
[HttpPost]
public IActionResult Sample(SampleViewModel model)
{
if (ModelState.IsValid == false) View(model);
// ModelState の値を消してモデルの値をビューに返却できるようにする
ModelState.Remove(nameof(model.ResultValue1));
// ビューに返す値を設定する
model.ResultValue1 = model.InputValue + " テキストを追加1";
model.ResultValue2 = model.InputValue + " テキストを追加2";
return View(model);
}