Spiegeln Sie den Wert wider, der in der Aktion nach dem Posten des Formulars in der Ansicht geändert wurde
Umwelt
- Visual Studio
-
- Visual Studio 2022
- ASP.NET Kern
-
- 6,0 MVC
Es funktioniert in anderen Umgebungen als den oben genannten, aber der veröffentlichte Code wurde im obigen Framework geschrieben.
Was zu machen ist
Versuchen Sie, ein einfaches Programm zu erstellen, das besagt: "Veröffentlichen Sie den Text, den Sie auf dem Bildschirm eingegeben haben, und geben Sie den verarbeiteten Text als neues Ergebnis an denselben Bildschirm zurück."
Code
Die Basis ist die Erstellung eines neuen MVC-Projekts, aus dem Sie Code hinzufügen. Der Code wird für die Gesamtkonfiguration veröffentlicht, also beziehen Sie sich bitte darauf.
Modell (Viewmodel)
Erstellen Sie das folgende Modell für die Interaktion zwischen Ansicht und Aktion: ResultValue
Es gibt zwei, aber ich wollte zwei Ergebnisse in der Ansicht geben, also habe ich zwei vorbereitet.
SampleViewModel
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; }
}
}
Aktion
Es ist ein einfacher Prozess: Zeigen Sie die Ansicht an, nehmen Sie den in POST eingegebenen Text, verarbeiten Sie ihn und geben Sie das Ergebnis zurück.
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);
}
}
}
ansehen
Erstellen Sie Ansichten basierend auf Aktionen und Modellen.
Wenn Sie ResultValue1
auf die Aktualisierungsschaltfläche klicken und ResultValue2
angezeigt werden, werden sie jedoch in "Eingabetext" bzw. "im div-Tag" angezeigt.
Beispiel.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
Fügen Sie einen Link hinzu, damit Sie von Sample
zu wechseln können.
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> @* 追加 *@
Das Aktualisieren des im POST-Prozess empfangenen Modells wirkt sich nicht auf die Eingabe der Ansicht usw. aus.
Führen Sie den oben erstellten Code aus, geben Sie ihn über InputValue
den Beispielbildschirm ein, und versuchen Sie, ihn zu aktualisieren.
Auf der Aktionsseite, ResultValue1
da die Werte auf gesetzt und ResultValue2
zurückgegeben werden, wird davon ausgegangen, dass beide ursprünglich angezeigt werden, aber tatsächlich div
nur die 2 im Tag festgelegten Werte angezeigt werden.
Der auf ModelState festgelegte Wert hat Vorrang
Wenn der Client den Eingabewert post, wird der Wert auf die Modellvariable des ControllerBase.ModelState
Arguments festgelegt, aber auch der Wert wird festgelegt.
Der eingegebene Wert wird dann überprüft, wobei der Wert auf festgelegt ist ModelState
. ModelState.IsValid
Deshalb wird es beurteilt.
Beim Debuggen können Sie den Inhalt überprüfen, indem Sie die Verarbeitung am Haltepunkt beenden.
Wenn Sie ursprünglich einen Wert an die Ansicht zurückgeben möchten, ist return View(model);
es in Ordnung, einzuschließen, aber wenn ein Wert auf festgelegt istModelState
,ModelState
hat der Wert von Vorrang und wird an die Ansicht zurückgegeben.
ModelState
Da der Wert, der auf gesetzt ist, ein Wert ist, der durch Eingabe der Ansicht usw. in Bezug auf InputValue
das Modell gesendet wird, wird festgelegt ResultValue1
.
DaherResultValue1
hat ModelState
der Wert von Vorrang, und der im Modell festgelegte Wert,ModelState
der nicht ResultValue2
auf festgelegt ist, wird in der Ansicht angezeigt.
So geben Sie einen Wert zugunsten eines Modellwerts an eine Ansicht zurück
ModelState
Werte, die so festgelegt sind, dass sie Vorrang vor der Ansicht haben, wenn ModelState
Sie also die auf festgelegten Werte löschen, wird der Wert des Modells an die Ansicht zurückgegeben.
ModelState.Clear()
Sie können alle vorhandenen Werte löschen, indem ModelState
Sie wie folgt aufrufen:
[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
führt auch den Validierungsprozess durch,ModelState.Clear
also ModelState.IsValid
lesen Sie es unbedingt nach dem Aufruf .
Wenn Sie es ausführen, wird das Ergebnis wie folgt korrekt angezeigt.
ModelState.Clear
Da beim Aufruf einer Methode alle Werte verschwinden, ist es auch möglich, den Eigenschaftsnamen des Modells anzugeben und die Werte einzeln wie folgt zu löschen.
[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);
}