Αντικατοπτρίζει την τιμή που άλλαξε στην ενέργεια μετά τη δημοσίευση της φόρμας στην προβολή

Ημερομηνία δημιουργίας σελίδας :

περιβάλλον

Οπτικό Στούντιο
  • Οπτικό Στούντιο 2022
πυρήνας ASP.NET
  • 6.0 MVC

Λειτουργεί σε περιβάλλοντα άλλα από τα παραπάνω, αλλά ο δημοσιευμένος κώδικας γράφτηκε στο παραπάνω πλαίσιο.

Τι να φτιάξετε

Προσπαθήστε να δημιουργήσετε ένα απλό πρόγραμμα που λέει, "Δημοσιεύστε το κείμενο που πληκτρολογήσατε στην οθόνη και επιστρέψτε το επεξεργασμένο κείμενο στην ίδια οθόνη με ένα νέο αποτέλεσμα".

κώδικας

Η βάση είναι η δημιουργία ενός νέου έργου MVC, από το οποίο προσθέτετε κώδικα. Ο κώδικας δημοσιεύεται για τη συνολική διαμόρφωση, οπότε ανατρέξτε σε αυτό.

Μοντέλο (viewmodel)

Δημιουργήστε το ακόλουθο μοντέλο για αλληλεπίδραση προβολής και ενέργειας: ResultValue Υπάρχουν δύο, αλλά ήθελα να δώσω δύο αποτελέσματα στην άποψη, οπότε προετοίμασα δύο.

ΔείγμαView Μόντελ

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

ενέργεια

Είναι μια απλή διαδικασία: μπορείτε να εμφανίσετε την προβολή, να πάρετε το κείμενο που έχει εισαχθεί στο POST, να το επεξεργαστείτε και να επιστρέψετε το αποτέλεσμα.

Αρχική Έλεγχος

// 省略

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

άποψη

Δημιουργήστε προβολές με βάση ενέργειες και μοντέλα.

Όταν κάνετε ResultValue1 κλικ στο κουμπί ενημέρωσης και ResultValue2 εμφανίζονται, αλλά εμφανίζονται σε "κείμενο εισόδου" και "σε ετικέτα div", αντίστοιχα.

Δείγμα.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 στο .

Ευρετήριο.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 δεν επηρεάζει την είσοδο της προβολής κ.λπ.

Εκτελέστε τον κώδικα που δημιουργήσατε παραπάνω, εισαγάγετε από InputValue την οθόνη Δείγμα και προσπαθήστε να ενημερώσετε.

Από την πλευρά της ενέργειας, ResultValue1 δεδομένου ότι οι τιμές έχουν οριστεί και επιστραφεί, θεωρείται ότι και ResultValue2 οι δύο εμφανίζονται αρχικά, αλλά στην πραγματικότητα div εμφανίζονται μόνο τα 2 που έχουν οριστεί στην ετικέτα.

Η τιμή που έχει οριστεί στο ModelState έχει προτεραιότητα

Όταν ο υπολογιστής-πελάτης posts την τιμή εισόδου, η τιμή ορίζεται στη μεταβλητή μοντέλου του ορίσματος ControllerBase.ModelState , αλλά η τιμή έχει επίσης οριστεί. Στη συνέχεια , η ModelState τιμή που εισάγεται επικυρώνεται με την τιμή να έχει οριστεί σε . ModelState.IsValid Αυτός είναι ο λόγος για τον οποίο κρίνεται. Κατά τον εντοπισμό σφαλμάτων, μπορείτε να ελέγξετε τα περιεχόμενα σταματώντας την επεξεργασία στο σημείο διακοπής.

Εάν θέλετε αρχικά να επιστρέψετε μια τιμή στην προβολή, είναι return View(model); εντάξει να συμπεριλάβετε , αλλά αν μια τιμή ModelState έχει οριστεί σε ,ModelState η τιμή έχει προτεραιότητα και επιστρέφεται στην προβολή.

ModelState Δεδομένου ότι η τιμή που έχει οριστεί είναι μια τιμή που αποστέλλεται εισάγοντας την προβολή κ.λπ., όσον αφορά InputValueτο μοντέλο, έχει ResultValue1 οριστεί. Επομένως,ResultValue1 η τιμή έχει ModelState προτεραιότητα και ηModelState τιμή που έχει οριστεί στο μοντέλο που δεν ResultValue2 έχει οριστεί εμφανίζεται στην προβολή.

Για να επιστρέψετε μια τιμή σε μια προβολή υπέρ μιας τιμής μοντέλου

ModelState Οι τιμές που έχουν οριστεί να έχουν προτεραιότητα στην προβολή, επομένως αν ModelState διαγράψετε τις τιμές που έχουν οριστεί σε , η τιμή του μοντέλου θα επιστραφεί στην προβολή.

ModelState.Clear() Μπορείτε να διαγράψετε όλες τις τιμές που έχουν καλώντας ModelState ως εξής:

[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 Κάνει επίσης τη διαδικασία επικύρωσης,ModelState.Clear οπότε φροντίστε ModelState.IsValid να την διαβάσετε μετά την κλήση .

Όταν το εκτελείτε, το αποτέλεσμα θα εμφανίζεται σωστά ως εξής.

ModelState.Clear Δεδομένου ότι όλες οι τιμές εξαφανίζονται όταν καλείτε μια μέθοδο, είναι επίσης δυνατό να καθορίσετε το όνομα ιδιότητας του μοντέλου και να διαγράψετε τις τιμές ξεχωριστά ως εξής.

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