Відображення значення, зміненого в дії після публікації форми в поданні

Дата створення сторінки :

середовище

Візуальна студія
  • Візуальна студія 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);
}