Odráža hodnotu zmenenú v akcii po zaúčtovaní formulára v zobrazení

Dátum vytvorenia strany :

životné prostredie

Vizuálne štúdio
  • Visual Studio 2022
jadro ASP.NET
  • 6.0 MVC

Funguje v iných prostrediach, ako je uvedené vyššie, ale publikovaný kód bol napísaný v rámci vyššie.

Čo urobiť

Pokúste sa vytvoriť jednoduchý program, ktorý hovorí: "Uverejnite text, ktorý ste zadali na obrazovke, a vráťte spracovaný text na rovnakú obrazovku ako nový výsledok."

kód

Základom je vytvorenie nového projektu MVC, z ktorého pridáte kód. Kód je zverejnený pre celkovú konfiguráciu, preto si ho prosím prečítajte.

Model (viewmodel)

Vytvorte nasledujúci model interakcie zobrazenia a akcie: ResultValue Sú dva, ale chcel som dať dva výsledky v výhľade, takže som pripravil dva.

SampleViewModel

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; }
  }
}

akcia

Je to jednoduchý proces: zobrazte zobrazenie, vezmite text zadaný v POST, spracujte ho a vrátite výsledok.

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);
    }
  }
}

pohľad

Vytvárajte zobrazenia na základe akcií a modelov.

Keď kliknete ResultValue1 na tlačidlo aktualizácie a ResultValue2 zobrazia sa, ale zobrazia sa v "vstupnom texte" a "v potápačskej značke".

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 Pridajte prepojenie, aby ste mohli prejsť z Sample položky .

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>    @* 追加 *@

Aktualizácia modelu prijatého v procese POST nemá vplyv na vstup zobrazenia atď.

Spustite kód, ktorý ste vytvorili vyššie, zadajte z InputValue obrazovky Ukážka a pokúste sa aktualizovať.

Na strane akcie, ResultValue1 pretože hodnoty sú nastavené a ResultValue2 vrátené, predpokladá sa, že obe sú pôvodne zobrazené, ale v skutočnosti div sa zobrazia iba 2 množiny v značke.

Hodnota nastavená na ModelState má prednosť

Keď klient POST vstupnú hodnotu, hodnota je nastavená na premennú modelu argumentu ControllerBase.ModelState , ale hodnota je tiež nastavená. Zadaná hodnota sa ModelState potom overí s hodnotou nastavenou na . ModelState.IsValid To je dôvod, prečo je súdený v. Pri ladení môžete skontrolovať obsah zastavením spracovania v bode prerušenia.

Ak chcete pôvodne vrátiť hodnotu do zobrazenia, je return View(model); v poriadku zahrnúť , ale ak je ModelState hodnota nastavená na hodnotu ,ModelState hodnota má prednosť a vráti sa do zobrazenia.

ModelState Keďže nastavená hodnota je hodnota odoslaná zadaním zobrazenia atď., Pokiaľ ide o InputValuemodel, ResultValue1 je nastavená. PretoResultValue1 hodnota má ModelState prednosť a hodnota nastavená v modeli,ModelState ktorý nie ResultValue2 je nastavený na zobrazenie, sa zobrazí v zobrazení.

Vrátenie hodnoty do zobrazenia v prospech hodnoty modelu

ModelState Hodnoty nastavené tak, aby mali prednosť pred zobrazením, takže ak ModelState vymažete hodnoty nastavené na , hodnota modelu sa vráti do zobrazenia.

ModelState.Clear() Všetky hodnoty, ktoré majú, môžete vymazať takModelState, že zavoláte takto:

[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 tiež vykonáva proces overenia,ModelState.Clear takže si ho nezabudnite ModelState.IsValid prečítať po volaní .

Keď ho spustíte, výsledok sa zobrazí správne takto.

ModelState.Clear Keďže všetky hodnoty zmiznú, keď zavoláte metódu, je tiež možné zadať názov vlastnosti modelu a vymazať hodnoty jednotlivo nasledovne.

[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);
}