Afspejle den værdi, der er ændret i handlingen efter bogføring af formularen i visningen

Dato for oprettelse af side :

miljø

Visual Studio
  • Visual Studio 2022
ASP.NET kerne
  • 6.0 MVC

Det fungerer i andre miljøer end ovenstående, men den offentliggjorte kode blev skrevet i rammen ovenfor.

Hvad skal man lave

Prøv at oprette et simpelt program, der siger: "Send den tekst, du skrev, på skærmen, og returner den behandlede tekst til den samme skærm som et nyt resultat."

kodeks

Basen er oprettelsen af et nyt MVC-projekt, hvorfra du tilføjer kode. Koden offentliggøres for den overordnede konfiguration, så se den.

Model (visningsmodel)

Opret følgende model for visnings- og handlingsinteraktion: ResultValue Der er to, men jeg ville gerne give to resultater i visningen, så jeg forberedte to.

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

handling

Det er en simpel proces: Få vist visningen, tag den tekst, der er indtastet i POST, behandle den og returnere resultatet.

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

udsigt

Opret visninger baseret på handlinger og modeller.

Når du ResultValue1 klikker på opdateringsknappen og ResultValue2 vises, men de vises i henholdsvis "input text" og "in 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 Tilføj et link, så du kan skifte fra Sample til .

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

Opdatering af den model, der modtages i POST-processen, påvirker ikke indtastningen af visningen osv.

Kør den kode, du oprettede ovenfor, indtast fra InputValue skærmbilledet Eksempel, og prøv at opdatere.

På handlingssiden, ResultValue1 da værdierne er indstillet til og ResultValue2 returneret, antages det, at begge oprindeligt vises, men faktisk div vises kun de 2 sæt i tagget.

Den værdi, der er angivet til ModelState, har forrang

Når klienten POST'er inputværdien, angives værdien til argumentets modelvariabel ControllerBase.ModelState , men værdien angives også. Den indtastede værdi valideres ModelState derefter med værdien indstillet til . ModelState.IsValid Derfor bedømmes det i. Når du foretager fejlfinding, kan du kontrollere indholdet ved at stoppe behandlingen ved brudpunktet.

Hvis du oprindeligt vil returnere en værdi til visningen, er return View(model); det OK at medtage , men hvis en værdi er ModelState indstillet til ,ModelState har værdien af har forrang og returneres til visningen.

ModelState Da den værdi, der er indstillet til, er en værdi, der sendes ved at indtaste visningen osv., Med hensyn til InputValuemodellen, ResultValue1 er indstillet. ResultValue1 Derfor har værdien af forrang ModelState , og den værdi,ModelState der er angivet i den model, der ikke ResultValue2 er angivet til, vises i visningen.

Sådan returneres en værdi til en visning til fordel for en modelværdi

ModelState Værdier, der er angivet til at have forrang for visningen, så hvis ModelState du sletter de værdier, der er angivet til, returneres værdien af modellen til visningen.

ModelState.Clear() Du kan slette alle de værdier, der er, ved ModelState at ringe som følger:

[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 udfører også valideringsprocessen,ModelState.Clear så sørg ModelState.IsValid for at læse den efter, når du ringer .

Når du kører det, vises resultatet korrekt som følger.

ModelState.Clear Da alle værdier forsvinder, når du kalder en metode, er det også muligt at angive egenskabsnavnet på modellen og slette værdierne individuelt som følger.

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