Reflectarea valorii modificate în acțiunea după postarea formularului în vizualizare

Data creării paginii :

mediu

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

Funcționează în alte medii decât cele de mai sus, dar codul publicat a fost scris în cadrul de mai sus.

Ce să faci

Încercați să creați un program simplu care spune: "Postați textul pe care l-ați tastat pe ecran și returnați textul procesat pe același ecran ca rezultat nou."

cod

Baza este crearea unui nou proiect MVC, din care adăugați cod. Codul este publicat pentru configurația generală, așa că vă rugăm să consultați-l.

Model (viewmodel)

Creați următorul model pentru interacțiunea de vizualizare și acțiune: ResultValue Sunt două, dar am vrut să dau două rezultate în punct de vedere, așa că am pregătit două.

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

acțiune

Este un proces simplu: ajungeți să afișați vizualizarea, să luați textul introdus în POST, să-l procesați și să returnați rezultatul.

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

vedere

Creați vizualizări pe baza acțiunilor și modelelor.

Când faceți ResultValue1 clic pe butonul de actualizare, și ResultValue2 sunt afișate, dar acestea sunt afișate în "text de intrare" și "în div tag-ul", respectiv.

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 Adăugați un link, astfel încât să puteți trece de la la 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>    @* 追加 *@

Actualizarea modelului primit în procesul POST nu afectează introducerea vizualizării etc.

Rulați codul pe care l-ați creat mai sus, introduceți din InputValue ecranul Eșantion și încercați să actualizați.

Pe partea de acțiune, ResultValue1 deoarece valorile sunt setate și ResultValue2 returnate, se presupune că ambele sunt afișate inițial, dar, de fapt div , se afișează numai cele 2 setate în etichetă.

Valoarea setată la ModelState are prioritate

Când clientul POSTs valoarea de intrare, valoarea este setată la variabila model a argumentului ControllerBase.ModelState , dar valoarea este, de asemenea, setată. Valoarea introdusă este ModelState apoi validată cu valoarea setată la . ModelState.IsValid De aceea este judecat în. Când depanați, puteți verifica conținutul oprind procesarea la punctul de întrerupere.

Dacă inițial doriți să returnați o valoare vizualizării, este return View(model); OK să includeți , dar dacă o valoare este ModelState setată la ,ModelState valoarea are prioritate și este returnată la vizualizare.

ModelState Deoarece valoarea setată la este o valoare trimisă prin introducerea vizualizării etc., în ceea ce privește InputValuemodelul, , ResultValue1 este setată. De aceea,ResultValue1 valoarea are ModelState prioritate și valoarea setatăModelState în modelul care nu ResultValue2 este setat la se afișează în vizualizarea.

Pentru a returna o valoare la o vizualizare în favoarea unei valori model

ModelState Valorile setate să aibă prioritate față de vizualizare, deci dacă ModelState ștergeți valorile setate la , valoarea modelului va fi returnată la vizualizare.

ModelState.Clear() Puteți șterge toate valorile pe care le are ModelState apelând după cum urmează:

[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 face, de asemenea, procesul de validare,ModelState.Clear deci asigurați-vă că ModelState.IsValid îl citiți după ce sunați .

Când îl executați, rezultatul va fi afișat corect după cum urmează.

ModelState.Clear Deoarece toate valorile dispar atunci când apelați o metodă, este de asemenea posibil să specificați numele proprietății modelului și să ștergeți valorile individual, după cum urmează.

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