Atspoguļot vērtību, kas mainīta darbībā pēc formas publicēšanas skatā

Lapas izveides datums :

vide

Vizuālā studija
  • Vizuālā studija 2022
ASP.NET kodols
  • 6.0 MVC

Tas darbojas vidē, kas nav iepriekš minētā, bet publicētais kods tika rakstīts iepriekš minētajā kontekstā.

Ko darīt

Mēģiniet izveidot vienkāršu programmu, kurā teikts: "Ievietojiet ekrānā ierakstīto tekstu un atgrieziet apstrādāto tekstu tajā pašā ekrānā, kurā ir jauns rezultāts."

kods

Pamatā ir jauna MVC projekta izveide, no kura jūs pievienojat kodu. Kods ir publicēts vispārējai konfigurācijai, tāpēc, lūdzu, skatiet to.

Modelis (viewmodel)

Izveidojiet šādu skata un darbības mijiedarbības modeli: ResultValue Ir divi, bet es gribēju sniegt divus rezultātus skatījumā, tāpēc es sagatavoju divus.

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

darbība

Tas ir vienkāršs process: parādīt skatu, paņemt post ievadīto tekstu, apstrādāt to un atgriezt rezultātu.

SākumsKontrollers

// 省略

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

skats

Izveidojiet skatus, pamatojoties uz darbībām un modeļiem.

ResultValue1 Noklikšķinot uz atjaunināšanas pogas, un ResultValue2 tie tiek parādīti, bet tie tiek parādīti attiecīgi "ievades tekstā" un "div tagā".

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 Pievienojiet saiti, lai varētu pāriet no Sample programmas uz .

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 procesā saņemtā modeļa atjaunināšana neietekmē skata ievadi utt.

Palaidiet iepriekš izveidoto kodu, ievadiet no InputValue parauga ekrāna un mēģiniet atjaunināt.

Darbības pusē, ResultValue1 tā kā vērtības ir iestatītas un ResultValue2 atgrieztas, tiek pieņemts, ka abas sākotnēji tiek rādītas, bet patiesībā div tiek parādītas tikai 2 tagā iestatītās kopas.

Uz ModelState iestatītajai vērtībai ir prioritāte

Kad klients POSTs ievades vērtību, vērtība tiek iestatīta uz modeļa mainīgo ControllerBase.ModelState argumenta, bet vērtība ir arī iestatīta. Ievadītā vērtība pēc tam tiek ModelState validēta ar vērtību, kas iestatīta uz . ModelState.IsValid Tāpēc tas tiek vērtēts. Atkļūdojot, varat pārbaudīt saturu, pārtraucot apstrādi pārtraukumpunktā.

Ja sākotnēji vēlaties atgriezt vērtību skatā, ir return View(model); labi iekļaut , bet, ja vērtība ir ModelState iestatīta uz ,ModelState vērtība ir prioritāra un tiek atgriezta skatā.

ModelState Tā kā iestatītā vērtība ir vērtība, kas nosūtīta, ievadot skatu utt. modeļa izteiksmē InputValue, ResultValue1 ir iestatīta. Tāpēc skatā tiek parādīta vērtība,ResultValue1 kurai ir ModelState prioritāte, un skatā tiek parādīta vērtība,ModelState kas iestatīta modelī, uz kuru nav ResultValue2 iestatīta.

Lai atgrieztu vērtību skatā par labu modeļa vērtībai

ModelState Vērtības, kas iestatītas kā prioritāras attiecībā pret skatu, tāpēc, ja ModelState izdzēsīsit vērtības, uz kurām iestatītās vērtības, modeļa vērtība tiks atgriezta skatā.

ModelState.Clear() Visas vērtības, kas ir, var izdzēst, zvanot ModelState šādi:

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

ModelStateveic arī validācijas procesu, tāpēc noteikti ModelState.IsValid izlasiet to pēc tam,ModelState.Clear kad zvanāt .

Palaižot to, rezultāts tiks parādīts pareizi šādi.

ModelState.Clear Tā kā visas vērtības pazūd, izsaucot metodi, ir iespējams arī norādīt modeļa rekvizīta nosaukumu un izdzēst vērtības atsevišķi šādi.

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