De waarde weergeven die is gewijzigd in de actie na bericht van het formulier in de weergave
milieu
- Visual Studio
-
- Visual Studio 2022
- ASP.NET kern
-
- 6,0 MVC
Het werkt in andere omgevingen dan het bovenstaande, maar de gepubliceerde code is geschreven in het bovenstaande kader.
Wat te maken
Probeer een eenvoudig programma te maken dat zegt: "Plaats de tekst die u hebt getypt op het scherm en retourneer de verwerkte tekst naar hetzelfde scherm als een nieuw resultaat."
code
De basis is het maken van een nieuw MVC-project, van waaruit u code toevoegt. De code wordt gepubliceerd voor de algehele configuratie, dus raadpleeg deze.
Model (viewmodel)
Maak het volgende model voor weergave- en actie-interactie: ResultValue
Er zijn er twee, maar ik wilde twee resultaten in de weergave geven, dus ik bereidde er twee voor.
VoorbeeldBekijkModel
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; }
}
}
actie
Het is een eenvoudig proces: de weergave weergeven, de tekst nemen die in POST is ingevoerd, deze verwerken en het resultaat retourneren.
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);
}
}
}
bekijken
Maak weergaven op basis van acties en modellen.
Wanneer u ResultValue1
op de updateknop klikt, worden ResultValue2
deze weergegeven, maar ze worden weergegeven in respectievelijk "invoertekst" en "in div-tag".
Voorbeeld.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
Voeg een koppeling toe zodat u kunt overstappen van Sample
naar .
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> @* 追加 *@
Het bijwerken van het model dat in het POST-proces is ontvangen, heeft geen invloed op de invoer van de weergave, enz.
Voer de code uit die u hierboven hebt gemaakt, voer deze in vanuit InputValue
het voorbeeldscherm en probeer bij te werken.
Aan de actiekant, ResultValue1
aangezien de waarden worden ingesteld op en ResultValue2
geretourneerd, wordt aangenomen dat beide oorspronkelijk worden weergegeven, maar in feite div
worden alleen de 2-set in de tag weergegeven.
De waarde die is ingesteld op ModelState heeft voorrang
Wanneer de client de invoerwaarde opstelt, wordt de waarde ingesteld op de modelvariabele van het ControllerBase.ModelState
argument, maar wordt de waarde ook ingesteld.
De ingevoerde waarde wordt ModelState
vervolgens gevalideerd met de waarde ingesteld op . ModelState.IsValid
Daarom wordt het beoordeeld.
Bij foutopsporing kunt u de inhoud controleren door de verwerking op het breekpunt te stoppen.
Als u oorspronkelijk een waarde in de weergave wilt retourneren, is return View(model);
het OK om op te nemen , maar als een waarde is ModelState
ingesteld op ,ModelState
heeft de waarde van voorrang en wordt deze geretourneerd naar de weergave.
ModelState
Aangezien de waarde die is ingesteld op een waarde is die wordt verzonden door de weergave in te voeren, enz., In termen van InputValue
het model, wordt , ResultValue1
ingesteld.
Daarom heeftResultValue1
de waarde van voorrang ModelState
ModelState
en wordt de waarde die is ingesteld in het model dat niet ResultValue2
is ingesteld op weergegeven in de weergave.
Een waarde retourneren naar een weergave ten gunste van een modelwaarde
ModelState
Waarden die zijn ingesteld om voorrang te hebben op de weergave, dus als ModelState
u de waarden wist die zijn ingesteld op , wordt de waarde van het model geretourneerd naar de weergave.
ModelState.Clear()
U kunt alle waarden wissen door ModelState
deze als volgt aan te roepen:
[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
doet ook het validatieproces,ModelState.Clear
dus zorg ervoor dat u ModelState.IsValid
het naleest wanneer u belt .
Wanneer u het uitvoert, wordt het resultaat als volgt correct weergegeven.
ModelState.Clear
Aangezien alle waarden verdwijnen wanneer u een methode aanroept, is het ook mogelijk om de eigenschapsnaam van het model op te geven en de waarden als volgt afzonderlijk te wissen.
[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);
}