Spiegeln Sie den Wert wider, der in der Aktion nach dem Posten des Formulars in der Ansicht geändert wurde

Erstellungsdatum der Seite :

Umwelt

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

Es funktioniert in anderen Umgebungen als den oben genannten, aber der veröffentlichte Code wurde im obigen Framework geschrieben.

Was zu machen ist

Versuchen Sie, ein einfaches Programm zu erstellen, das besagt: "Veröffentlichen Sie den Text, den Sie auf dem Bildschirm eingegeben haben, und geben Sie den verarbeiteten Text als neues Ergebnis an denselben Bildschirm zurück."

Code

Die Basis ist die Erstellung eines neuen MVC-Projekts, aus dem Sie Code hinzufügen. Der Code wird für die Gesamtkonfiguration veröffentlicht, also beziehen Sie sich bitte darauf.

Modell (Viewmodel)

Erstellen Sie das folgende Modell für die Interaktion zwischen Ansicht und Aktion: ResultValue Es gibt zwei, aber ich wollte zwei Ergebnisse in der Ansicht geben, also habe ich zwei vorbereitet.

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

Aktion

Es ist ein einfacher Prozess: Zeigen Sie die Ansicht an, nehmen Sie den in POST eingegebenen Text, verarbeiten Sie ihn und geben Sie das Ergebnis zurück.

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

ansehen

Erstellen Sie Ansichten basierend auf Aktionen und Modellen.

Wenn Sie ResultValue1 auf die Aktualisierungsschaltfläche klicken und ResultValue2 angezeigt werden, werden sie jedoch in "Eingabetext" bzw. "im div-Tag" angezeigt.

Beispiel.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 Fügen Sie einen Link hinzu, damit Sie von Sample zu wechseln können.

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

Das Aktualisieren des im POST-Prozess empfangenen Modells wirkt sich nicht auf die Eingabe der Ansicht usw. aus.

Führen Sie den oben erstellten Code aus, geben Sie ihn über InputValue den Beispielbildschirm ein, und versuchen Sie, ihn zu aktualisieren.

Auf der Aktionsseite, ResultValue1 da die Werte auf gesetzt und ResultValue2 zurückgegeben werden, wird davon ausgegangen, dass beide ursprünglich angezeigt werden, aber tatsächlich div nur die 2 im Tag festgelegten Werte angezeigt werden.

Der auf ModelState festgelegte Wert hat Vorrang

Wenn der Client den Eingabewert post, wird der Wert auf die Modellvariable des ControllerBase.ModelState Arguments festgelegt, aber auch der Wert wird festgelegt. Der eingegebene Wert wird dann überprüft, wobei der Wert auf festgelegt ist ModelState . ModelState.IsValid Deshalb wird es beurteilt. Beim Debuggen können Sie den Inhalt überprüfen, indem Sie die Verarbeitung am Haltepunkt beenden.

Wenn Sie ursprünglich einen Wert an die Ansicht zurückgeben möchten, ist return View(model); es in Ordnung, einzuschließen, aber wenn ein Wert auf festgelegt istModelState,ModelState hat der Wert von Vorrang und wird an die Ansicht zurückgegeben.

ModelState Da der Wert, der auf gesetzt ist, ein Wert ist, der durch Eingabe der Ansicht usw. in Bezug auf InputValuedas Modell gesendet wird, wird festgelegt ResultValue1 . DaherResultValue1 hat ModelState der Wert von Vorrang, und der im Modell festgelegte Wert,ModelState der nicht ResultValue2 auf festgelegt ist, wird in der Ansicht angezeigt.

So geben Sie einen Wert zugunsten eines Modellwerts an eine Ansicht zurück

ModelState Werte, die so festgelegt sind, dass sie Vorrang vor der Ansicht haben, wenn ModelState Sie also die auf festgelegten Werte löschen, wird der Wert des Modells an die Ansicht zurückgegeben.

ModelState.Clear() Sie können alle vorhandenen Werte löschen, indem ModelState Sie wie folgt aufrufen:

[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 führt auch den Validierungsprozess durch,ModelState.Clear also ModelState.IsValid lesen Sie es unbedingt nach dem Aufruf .

Wenn Sie es ausführen, wird das Ergebnis wie folgt korrekt angezeigt.

ModelState.Clear Da beim Aufruf einer Methode alle Werte verschwinden, ist es auch möglich, den Eigenschaftsnamen des Modells anzugeben und die Werte einzeln wie folgt zu löschen.

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