Afspejle den værdi, der er ændret i handlingen efter bogføring af formularen i visningen
miljø
- Visual Studio
-
- Visual Studio 2022
- ASP.NET kerne
-
- 6.0 MVC
Det fungerer i andre miljøer end ovenstående, men den offentliggjorte kode blev skrevet i rammen ovenfor.
Hvad skal man lave
Prøv at oprette et simpelt program, der siger: "Send den tekst, du skrev, på skærmen, og returner den behandlede tekst til den samme skærm som et nyt resultat."
kodeks
Basen er oprettelsen af et nyt MVC-projekt, hvorfra du tilføjer kode. Koden offentliggøres for den overordnede konfiguration, så se den.
Model (visningsmodel)
Opret følgende model for visnings- og handlingsinteraktion: ResultValue
Der er to, men jeg ville gerne give to resultater i visningen, så jeg forberedte to.
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; }
}
}
handling
Det er en simpel proces: Få vist visningen, tag den tekst, der er indtastet i POST, behandle den og returnere resultatet.
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);
}
}
}
udsigt
Opret visninger baseret på handlinger og modeller.
Når du ResultValue1
klikker på opdateringsknappen og ResultValue2
vises, men de vises i henholdsvis "input text" og "in div tag".
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
Tilføj et link, så du kan skifte fra Sample
til .
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> @* 追加 *@
Opdatering af den model, der modtages i POST-processen, påvirker ikke indtastningen af visningen osv.
Kør den kode, du oprettede ovenfor, indtast fra InputValue
skærmbilledet Eksempel, og prøv at opdatere.
På handlingssiden, ResultValue1
da værdierne er indstillet til og ResultValue2
returneret, antages det, at begge oprindeligt vises, men faktisk div
vises kun de 2 sæt i tagget.
Den værdi, der er angivet til ModelState, har forrang
Når klienten POST'er inputværdien, angives værdien til argumentets modelvariabel ControllerBase.ModelState
, men værdien angives også.
Den indtastede værdi valideres ModelState
derefter med værdien indstillet til . ModelState.IsValid
Derfor bedømmes det i.
Når du foretager fejlfinding, kan du kontrollere indholdet ved at stoppe behandlingen ved brudpunktet.
Hvis du oprindeligt vil returnere en værdi til visningen, er return View(model);
det OK at medtage , men hvis en værdi er ModelState
indstillet til ,ModelState
har værdien af har forrang og returneres til visningen.
ModelState
Da den værdi, der er indstillet til, er en værdi, der sendes ved at indtaste visningen osv., Med hensyn til InputValue
modellen, ResultValue1
er indstillet.
ResultValue1
Derfor har værdien af forrang ModelState
, og den værdi,ModelState
der er angivet i den model, der ikke ResultValue2
er angivet til, vises i visningen.
Sådan returneres en værdi til en visning til fordel for en modelværdi
ModelState
Værdier, der er angivet til at have forrang for visningen, så hvis ModelState
du sletter de værdier, der er angivet til, returneres værdien af modellen til visningen.
ModelState.Clear()
Du kan slette alle de værdier, der er, ved ModelState
at ringe som følger:
[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
udfører også valideringsprocessen,ModelState.Clear
så sørg ModelState.IsValid
for at læse den efter, når du ringer .
Når du kører det, vises resultatet korrekt som følger.
ModelState.Clear
Da alle værdier forsvinder, når du kalder en metode, er det også muligt at angive egenskabsnavnet på modellen og slette værdierne individuelt som følger.
[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);
}