Αντικατοπτρίζει την τιμή που άλλαξε στην ενέργεια μετά τη δημοσίευση της φόρμας στην προβολή
περιβάλλον
- Οπτικό Στούντιο
-
- Οπτικό Στούντιο 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);
}