De waarde weergeven die is gewijzigd in de actie na bericht van het formulier in de weergave

Aanmaakdatum van pagina :

milieu

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

Het werkt in andere omgevingen dan het bovenstaande, maar de gepubliceerde code is geschreven in het bovenstaande kader.

Wat te maken

Probeer een eenvoudig programma te maken dat zegt: "Plaats de tekst die u hebt getypt op het scherm en retourneer de verwerkte tekst naar hetzelfde scherm als een nieuw resultaat."

code

De basis is het maken van een nieuw MVC-project, van waaruit u code toevoegt. De code wordt gepubliceerd voor de algehele configuratie, dus raadpleeg deze.

Model (viewmodel)

Maak het volgende model voor weergave- en actie-interactie: ResultValue Er zijn er twee, maar ik wilde twee resultaten in de weergave geven, dus ik bereidde er twee voor.

VoorbeeldBekijkModel

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

actie

Het is een eenvoudig proces: de weergave weergeven, de tekst nemen die in POST is ingevoerd, deze verwerken en het resultaat retourneren.

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

bekijken

Maak weergaven op basis van acties en modellen.

Wanneer u ResultValue1 op de updateknop klikt, worden ResultValue2 deze weergegeven, maar ze worden weergegeven in respectievelijk "invoertekst" en "in div-tag".

Voorbeeld.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 Voeg een koppeling toe zodat u kunt overstappen van Sample naar .

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

Het bijwerken van het model dat in het POST-proces is ontvangen, heeft geen invloed op de invoer van de weergave, enz.

Voer de code uit die u hierboven hebt gemaakt, voer deze in vanuit InputValue het voorbeeldscherm en probeer bij te werken.

Aan de actiekant, ResultValue1 aangezien de waarden worden ingesteld op en ResultValue2 geretourneerd, wordt aangenomen dat beide oorspronkelijk worden weergegeven, maar in feite div worden alleen de 2-set in de tag weergegeven.

De waarde die is ingesteld op ModelState heeft voorrang

Wanneer de client de invoerwaarde opstelt, wordt de waarde ingesteld op de modelvariabele van het ControllerBase.ModelState argument, maar wordt de waarde ook ingesteld. De ingevoerde waarde wordt ModelState vervolgens gevalideerd met de waarde ingesteld op . ModelState.IsValid Daarom wordt het beoordeeld. Bij foutopsporing kunt u de inhoud controleren door de verwerking op het breekpunt te stoppen.

Als u oorspronkelijk een waarde in de weergave wilt retourneren, is return View(model); het OK om op te nemen , maar als een waarde is ModelState ingesteld op ,ModelState heeft de waarde van voorrang en wordt deze geretourneerd naar de weergave.

ModelStateAangezien de waarde die is ingesteld op een waarde is die wordt verzonden door de weergave in te voeren, enz., In termen van InputValuehet model, wordt , ResultValue1 ingesteld. Daarom heeftResultValue1 de waarde van voorrang ModelStateModelState en wordt de waarde die is ingesteld in het model dat niet ResultValue2 is ingesteld op weergegeven in de weergave.

Een waarde retourneren naar een weergave ten gunste van een modelwaarde

ModelState Waarden die zijn ingesteld om voorrang te hebben op de weergave, dus als ModelState u de waarden wist die zijn ingesteld op , wordt de waarde van het model geretourneerd naar de weergave.

ModelState.Clear() U kunt alle waarden wissen door ModelState deze als volgt aan te roepen:

[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 doet ook het validatieproces,ModelState.Clear dus zorg ervoor dat u ModelState.IsValid het naleest wanneer u belt .

Wanneer u het uitvoert, wordt het resultaat als volgt correct weergegeven.

ModelState.Clear Aangezien alle waarden verdwijnen wanneer u een methode aanroept, is het ook mogelijk om de eigenschapsnaam van het model op te geven en de waarden als volgt afzonderlijk te wissen.

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