Återspegla värdet som ändrats i åtgärden efter inlägget av formuläret i vyn
miljö
- Visuell studio
-
- Visual Studio 2022
- ASP.NET kärna
-
- 6.0 MVC
Den fungerar i andra miljöer än ovanstående, men den publicerade koden skrevs inom ramen ovan.
Vad man ska göra
Försök att skapa ett enkelt program där det står: "Lägg upp texten du skrev på skärmen och returnera den bearbetade texten till samma skärm som ett nytt resultat."
kod
Basen är skapandet av ett nytt MVC-projekt, från vilket du lägger till kod. Koden publiceras för den övergripande konfigurationen, så se den.
Modell (viewmodel)
Skapa följande modell för visnings- och åtgärdsinteraktion: ResultValue
Det finns två, men jag ville ge två resultat i den åsikten, så jag förberedde två.
Exempel påViewModel
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 är en enkel process: få visa vyn, ta texten som anges i POST, bearbeta den och returnera resultatet.
HemKontroller
// 省略
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);
}
}
}
utsikt
Skapa vyer baserat på åtgärder och modeller.
När du ResultValue1
klickar på uppdateringsknappen och ResultValue2
visas, men de visas i "inmatningstext" respektive "in div-tagg".
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
Lägg till en länk så att du kan gå från Sample
till .
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> @* 追加 *@
Uppdatering av modellen som tas emot i POST-processen påverkar inte indata i vyn etc.
Kör koden du skapade ovan, ange från InputValue
exempelskärmen och försök uppdatera.
På åtgärdssidan, ResultValue1
eftersom värdena är inställda på och ResultValue2
returneras, antas det att båda ursprungligen visas, men i själva verket div
visas bara de 2 som anges i taggen.
Värdet som anges i ModelState har företräde
När klienten posts indatavärdet anges värdet till modellvariabeln för ControllerBase.ModelState
argumentet, men värdet anges också.
Det angivna värdet valideras ModelState
sedan med värdet inställt på . ModelState.IsValid
Det är därför det bedöms in.
När du felsöker kan du kontrollera innehållet genom att stoppa bearbetningen vid brytpunkten.
Om du ursprungligen vill returnera ett värde till vyn är return View(model);
det OK att inkludera , men om ett värde har ModelState
angetts tillModelState
har värdet för prioritet och returneras till vyn.
ModelState
Eftersom värdet som anges är ett värde som skickas genom att mata in vyn osv., när det gäller InputValue
modellen, anges ResultValue1
.
DärförResultValue1
har värdet för företräde ModelState
ochModelState
värdet som anges i modellen som inte ResultValue2
är inställt på visas i vyn.
Så här returnerar du ett värde till en vy till förmån för ett modellvärde
ModelState
Värden som har angetts ha företräde framför vyn, så om ModelState
du raderar de värden som angetts till returneras modellens värde till vyn.
ModelState.Clear()
Du kan radera alla värden som har genom ModelState
att anropa enligt följande:
[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
gör också valideringsprocessen,ModelState.Clear
så se ModelState.IsValid
till att läsa den efter när du ringer .
När du kör det visas resultatet korrekt enligt följande.
ModelState.Clear
Eftersom alla värden försvinner när du anropar en metod är det också möjligt att ange modellens egenskapsnamn och radera värdena individuellt enligt följande.
[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);
}