Återspegla värdet som ändrats i åtgärden efter inlägget av formuläret i vyn

Datum för skapande av sida :

miljö

Visuell studio
  • Visual Studio 2022
ASP.NET kärna
  • 6.0 MVC

Den fungerar i andra miljöer än ovanstående, men den publicerade koden skrevs inom ramen ovan.

Vad man ska göra

Försök att skapa ett enkelt program där det står: "Lägg upp texten du skrev på skärmen och returnera den bearbetade texten till samma skärm som ett nytt resultat."

kod

Basen är skapandet av ett nytt MVC-projekt, från vilket du lägger till kod. Koden publiceras för den övergripande konfigurationen, så se den.

Modell (viewmodel)

Skapa följande modell för visnings- och åtgärdsinteraktion: ResultValue Det finns två, men jag ville ge två resultat i den åsikten, så jag förberedde två.

Exempel påViewModel

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 är en enkel process: få visa vyn, ta texten som anges i POST, bearbeta den och returnera resultatet.

HemKontroller

// 省略

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

utsikt

Skapa vyer baserat på åtgärder och modeller.

När du ResultValue1 klickar på uppdateringsknappen och ResultValue2 visas, men de visas i "inmatningstext" respektive "in div-tagg".

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 Lägg till en länk så att du kan gå från Sample till .

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

Uppdatering av modellen som tas emot i POST-processen påverkar inte indata i vyn etc.

Kör koden du skapade ovan, ange från InputValue exempelskärmen och försök uppdatera.

På åtgärdssidan, ResultValue1 eftersom värdena är inställda på och ResultValue2 returneras, antas det att båda ursprungligen visas, men i själva verket div visas bara de 2 som anges i taggen.

Värdet som anges i ModelState har företräde

När klienten posts indatavärdet anges värdet till modellvariabeln för ControllerBase.ModelState argumentet, men värdet anges också. Det angivna värdet valideras ModelState sedan med värdet inställt på . ModelState.IsValid Det är därför det bedöms in. När du felsöker kan du kontrollera innehållet genom att stoppa bearbetningen vid brytpunkten.

Om du ursprungligen vill returnera ett värde till vyn är return View(model); det OK att inkludera , men om ett värde har ModelState angetts tillModelState har värdet för prioritet och returneras till vyn.

ModelState Eftersom värdet som anges är ett värde som skickas genom att mata in vyn osv., när det gäller InputValuemodellen, anges ResultValue1 . DärförResultValue1 har värdet för företräde ModelState ochModelState värdet som anges i modellen som inte ResultValue2 är inställt på visas i vyn.

Så här returnerar du ett värde till en vy till förmån för ett modellvärde

ModelState Värden som har angetts ha företräde framför vyn, så om ModelState du raderar de värden som angetts till returneras modellens värde till vyn.

ModelState.Clear() Du kan radera alla värden som har genom ModelState att anropa enligt följande:

[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 gör också valideringsprocessen,ModelState.Clear så se ModelState.IsValid till att läsa den efter när du ringer .

När du kör det visas resultatet korrekt enligt följande.

ModelState.Clear Eftersom alla värden försvinner när du anropar en metod är det också möjligt att ange modellens egenskapsnamn och radera värdena individuellt enligt följande.

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