Atspindėti reikšmę, pakeistą veiksme po formos įrašo rodinyje

Puslapio sukūrimo data :

Aplinkos

Visual Studio
  • Visual Studio 2022
ASP.NET branduolys
  • 6,0 MVC

Jis veikia kitose aplinkose nei pirmiau, tačiau paskelbtas kodas buvo parašytas aukščiau pateiktoje sistemoje.

Ką daryti

Pabandykite sukurti paprastą programą, kurioje sakoma: "Paskelbkite tekstą, kurį įvedėte ekrane, ir grąžinkite apdorotą tekstą į tą patį ekraną kaip ir naują rezultatą".

Kodas

Pagrindas yra naujo MVC projekto, iš kurio pridedate kodą, kūrimas. Kodas skelbiamas bendrai konfigūracijai, todėl prašome kreiptis į jį.

Modelis (viewmodel)

Sukurkite šį rodinio ir veiksmo veiksmų modelį: ResultValue Yra du, bet aš norėjau duoti du rezultatus nuomone, todėl aš paruošiau du.

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

veiksmas

Tai paprastas procesas: gauti rodyti rodinį, paimti POST įvestą tekstą, apdoroti jį ir grąžinti rezultatą.

PradžiaKontroleris

// 省略

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

rodinys

Kurti rodinius pagal veiksmus ir modelius.

ResultValue1 Spustelėjus naujinimo mygtuką ir ResultValue2 jį rodant, jie rodomi atitinkamai "įvesties tekste" ir "div žymoje".

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 Įtraukite saitą, kad galėtumėte pereiti iš 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 proceso metu gauto modelio atnaujinimas neturi įtakos rodinio įvestims ir pan.

Paleiskite aukščiau sukurtą kodą, įveskite ekraną InputValue Pavyzdys ir bandykite naujinti.

Veiksmo pusėje, ResultValue1 kadangi reikšmės yra nustatytos ir ResultValue2 grąžintos, daroma prielaida, kad abi iš pradžių rodomos, tačiau iš tikrųjų div rodomos tik 2, nustatytos žymoje.

Pirmenybė teikiama "ModelState" nustatytai reikšmei

Kai klientas NUSTATO įvesties vertę, vertė nustatoma kaip argumento ControllerBase.ModelState modelio kintamasis, tačiau taip pat nustatoma vertė. Tada įvesta ModelState reikšmė tikrinama, kai reikšmė nustatyta kaip . ModelState.IsValid Štai kodėl jis yra vertinamas. Derindami galite patikrinti turinį sustabdydami apdorojimą lūžio taške.

Jei iš pradžių norite grąžinti reikšmę į rodinį, gerai return View(model); įtraukti , bet jei reikšmė ModelState nustatyta kaip ,ModelState reikšmė yra viršesnė ir grąžinama į rodinį.

ModelState Kadangi nustatyta reikšmė yra reikšmė, siunčiama įvedant rodinį ir t. t., modelio požiūriu InputValue, ResultValue1 nustatoma. TodėlResultValue1 pirmenybė teikiama ModelState reikšmei,ModelState o rodinyje rodoma modelio, kurio nenustatyta ResultValue2 , reikšmė.

Reikšmės grąžinimas rodiniui modelio reikšmės naudai

ModelState Reikšmės, nustatytos taip, kad pirmenybė būtų teikiama rodiniui, taigi, jei ModelState ištrinsite nustatytas reikšmes , modelio reikšmė bus grąžinta į rodinį.

ModelState.Clear() Galite ištrinti visas reikšmes, kurias turite skambindami ModelState taip:

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

ModelStatetaip pat atlieka tikrinimo procesą, todėl būtinai perskaitykite ModelState.IsValid jį po to,ModelState.Clear kai skambinate .

Kai jį paleisite, rezultatas bus rodomas teisingai.

ModelState.Clear Kadangi visos reikšmės išnyksta, kai skambinate metodu, taip pat galima nurodyti modelio ypatybių pavadinimą ir ištrinti reikšmes atskirai.

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