Odraža vrednost, spremenjeno v dejanju po objavi obrazca v pogledu

Datum ustvarjanja strani :

okolje

Vizualni studio
  • Vizualni studio 2022
ASP.NET Jedro
  • 6.0 MVC

Deluje v drugih okoljih, kot je navedeno, vendar je bila objavljena koda zapisana v zgornjem okviru.

Kaj narediti

Poskusite ustvariti preprost program, ki pravi: "Objavite besedilo, ki ste ga vtipkali na zaslonu in vrnite obdelano besedilo na isti zaslon kot nov rezultat."

koda

Osnova je izdelava novega projekta MVC, iz katerega dodajate kodo. Koda je objavljena za celotno konfiguracijo, zato si jo poglejte.

Model (viewmodel)

Ustvarite ta model za ogled in interakcijo z dejanji: ResultValue Dva sta, vendar sem želel dati dva izida v stališču, zato sem 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; }
  }
}

dejanje

Gre za preprost postopek: prikažete pogled, vzamete besedilo, vneseno v POST, ga obdelate in vrnete rezultat.

DomovKontrolar

// 省略

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

Pogled

Ustvarite poglede na podlagi dejanj in modelov.

Ko kliknete ResultValue1 gumb za ResultValue2 posodobitev in so prikazani, vendar so prikazani v »vnosnem besedilu« oziroma »v div oznaki«.

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 Dodajte povezavo, tako da lahko prehajate iz 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>    @* 追加 *@

Posodabljanje modela, prejetega v post postopku, ne vpliva na vnos pogleda itd.

Zaženite zgoraj ustvarjeno kodo, vnesite na vzorčni InputValue zaslon in poskusite posodobiti.

Na strani dejanja, ResultValue1 ResultValue2 ker so vrednosti nastavljene na in vrnjene, se domneva, da sta oba prvotno prikazana, div v resnici pa sta prikazana le 2 nabora v oznaki.

Prednost ima vrednost, nastavljena na ModelState

Ko odjemalec POSTs vhodno vrednost, je vrednost nastavljena na spremenljivko modela ControllerBase.ModelState argumenta, vrednost pa je nastavljena tudi. Vnesena vrednost se ModelState nato potrdi z vrednostjo, nastavljeno na . ModelState.IsValid Zato je tudi sodilno. Pri odpravljanju napak lahko vsebino preverite tako, da ustavite obdelavo na prelomni točki.

Če želite prvotno vrniti vrednost v pogled, return View(model); je v redu, da vključite , ModelState če pa je vrednost nastavljena na ,ModelState ima vrednost prednost in se vrne v pogled.

ModelStateKer je nastavljena vrednost vrednost, poslana z vnosom pogleda itd., InputValuev smislu modela, je ResultValue1 nastavljena. Zato imaResultValue1 ModelStateModelState vrednost prednost in vrednost, nastavljena v modeluResultValue2, ki ni nastavljen na, je prikazana v pogledu.

Vračanje vrednosti v pogled v korist vrednosti modela

ModelState Vrednosti, nastavljene tako, da bodo imele prednost v pogledu, ModelState tako da če izbrišete vrednosti, nastavljene na , bo vrednost modela vrnjena v pogled.

ModelState.Clear() Vse vrednosti, ki jih imate, lahko izbrišete ModelState tako, da pokličete na naslednji način:

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

ModelStateprav tako dela postopek preverjanja veljavnosti, zato ModelState.IsValid se prepričajte,ModelState.Clear da ga preberite po tem, ko pokličete .

Ko ga zaženete, bo rezultat pravilno prikazan na naslednji način.

ModelState.Clear Ker vse vrednosti izginejo, ko pokličete metodo, je mogoče določiti tudi ime lastnosti modela in izbrisati vrednosti posebej, kot sledi.

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