Отразяване на стойността, променена в действието след публикацията на формуляра в изгледа

Дата на създаване на страница :

околна среда

Визуално студио
  • Визуално студио 2022
ASP.NET Ядро
  • 6.0 MVC

Той работи в среди, различни от горепосочените, но публикуваният код е написан в рамката по-горе.

Какво да направите

Опитайте се да създадете проста програма, която казва: "Публикувайте текста, който сте въвели на екрана, и върнете обработения текст на същия екран като нов резултат."

код

Базата е създаването на нов MVC проект, от който добавяте код. Кодът се публикува за цялостната конфигурация, така че моля, вижте го.

Модел (модел на изглед)

Създайте следния модел за взаимодействие с изглед и действие: ResultValue Има два, но исках да дам два резултата в гледката, затова подготвих два.

ПримеренВюМодел

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, да го обработите и да върнете резултата.

НачалоКонтролер

// 省略

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 етикет", съответно.

Проба.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 към .

Индекс.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); OK да включите , но ако е зададена стойност 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);
}