Görünümdeki formun postalanından sonra eylemde değiştirilen değeri yansıtma

Sayfa oluşturma tarihi :

çevre

Visual Studio
  • Visual Studio 2022
ASP.NET Çekirdek
  • 6.0 MVC

Yukarıdakiler dışındaki ortamlarda çalışır, ancak yayınlanan kod yukarıdaki çerçevede yazılmıştır.

Ne yapmalıyım

"Yazdığınız metni ekrana gönderin ve işlenen metni yeni bir sonuçla aynı ekrana döndürün" diyen basit bir program oluşturmaya çalışın.

kod

Temel, kod eklediğiniz yeni bir MVC projesinin oluşturulmasıdır. Kod genel yapılandırma için yayımlanıyor, bu yüzden lütfen ona bakın.

Model (viewmodel)

Görünüm ve eylem etkileşimi için aşağıdaki modeli oluşturun: ResultValue İki tane var, ama görüşte iki sonuç vermek istedim, bu yüzden iki tane hazırladım.

Örnek GörünümModel

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

eylem

Bu basit bir işlemdir: görünümü görüntüleme, POST'a girilen metni alma, işleme ve sonucu döndürme.

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

görünüm

Eylemlere ve modellere göre görünümler oluşturun.

Güncelleştir düğmesine tıkladığınızda ResultValue1 ve ResultValue2 görüntülendiğinde, ancak bunlar sırasıyla "giriş metni" ve "div etiketinde" görüntülenir.

Örnek.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 ' Sample ye geçiş yapabilmeniz için bir bağlantı ekleyin.

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

POST işleminde alınan modelin güncellenmesi görünümün girişini etkilemez, vb.

Yukarıda oluşturduğunuz kodu çalıştırın, Örnek ekranından InputValue girin ve güncelleştirmeye çalışın.

Eylem tarafında, ResultValue1 değerler ayarlanıp ResultValue2 döndür edildiğinden, her ikisinin de başlangıçta görüntülendiği varsayılır, ancak aslında yalnızca div etiketteki 2 kümesi görüntülenir.

ModelState olarak ayarlanan değer önceliklidir

İstemci giriş değerini öne çıktığında, değer bağımsız değişkenin model değişkenine ControllerBase.ModelState ayarlanır, ancak değer de ayarlanır. Girilen ModelState değer daha sonra değeri 'ye ayarlanmış olarak doğrulanır. ModelState.IsValid Bu yüzden yargılanıyor. Hata ayıklarken, kesme noktasında işlemeyi durdurarak içeriği denetleyebilirsiniz.

Başlangıçta görünüme bir değer döndürmek istiyorsanız, eklemek tamamdırreturn View(model);, ancak bir değer ModelState olarak ayarlanırsa,ModelState değeri önceliklidir ve görünüme döndürülür.

ModelStateAyarlanan değer görünüm girilirken gönderilen bir değer olduğundan, vb. model ResultValue1 açısından InputValueayarlanır. Bu nedenle,ResultValue1 değeri önceliklidir ModelStateModelState ve modelde ayarlanan ResultValue2 değer görünümde görüntülenir.

Model değeri lehine bir görünüme değer döndürmek için

ModelState Değerler görünümden öncelikli olacak şekilde ayarlanır, bu nedenle ' olarak ayarlanan değerleri silersenizModelState, modelin değeri görünüme döndürülür.

ModelState.Clear() Aşağıdaki gibi arayarak ModelState sahip olan tüm değerleri silebilirsiniz:

[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 doğrulama işlemini de yapıyor,ModelState.Clear bu yüzden çağırdıktan sonra okuduğunuzdan emin olun ModelState.IsValid .

Çalıştırdığınızda, sonuç aşağıdaki gibi doğru şekilde görüntülenir.

ModelState.Clear Bir yöntemi çağırdığınızda tüm değerler kaybolduğundan, modelin özellik adını belirtmek ve değerleri tek tek aşağıdaki gibi silmek de mümkündür.

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