Odráží hodnotu změněnou v akci po zaúčtování formuláře v zobrazení
životní prostředí
- Vizuální sada
-
- Vizuální sada 2022
- jádro ASP.NET
-
- 6,0 MVC
Funguje v jiných prostředích, než je výše uvedené, ale publikovaný kód byl napsán ve výše uvedeném rámci.
Co dělat
Pokuste se vytvořit jednoduchý program, který říká: "Zveřejněte text, který jste zadali na obrazovce, a vraťte zpracovaný text na stejnou obrazovku jako nový výsledek."
kód
Základem je vytvoření nového projektu MVC, ze kterého přidáte kód. Kód je publikován pro celkovou konfiguraci, proto se na něj prosím podívejte.
Model (viewmodel)
Vytvořte následující model pro interakci zobrazení a akce: ResultValue
Jsou dva, ale chtěl jsem dát dva výsledky v pohledu, takže jsem připravil dva.
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; }
}
}
akce
Je to jednoduchý proces: zobrazit zobrazení, vzít text zadaný do POST, zpracovat jej a vrátit výsledek.
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);
}
}
}
pohled
Vytvářejte zobrazení na základě akcí a modelů.
Když kliknete ResultValue1
na tlačítko aktualizace a ResultValue2
zobrazí se, ale zobrazí se v "vstupním textu" a "ve značce div".
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
Přidejte odkaz, abyste mohli přejít z Sample
na .
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> @* 追加 *@
Aktualizace modelu přijatého v procesu POST nemá vliv na vstup pohledu atd.
Spusťte kód, který jste vytvořili výše, zadejte z InputValue
ukázkové obrazovky a zkuste aktualizovat.
Na straně akce, ResultValue1
protože hodnoty jsou nastaveny a ResultValue2
vráceny, se předpokládá, že obě jsou původně zobrazeny, ale ve skutečnosti div
jsou zobrazeny pouze 2 nastavené v tagu.
Hodnota nastavená na ModelState má přednost
Když klient POSTSuje vstupní hodnotu, hodnota je nastavena na proměnnou modelu argumentu ControllerBase.ModelState
, ale hodnota je také nastavena.
Zadaná hodnota je ModelState
poté ověřena s hodnotou nastavenou na . ModelState.IsValid
To je důvod, proč je posuzována.
Při ladění můžete zkontrolovat obsah zastavením zpracování na zarážce.
Pokud jste původně chtěli vrátit hodnotu do zobrazení, je return View(model);
v pořádku zahrnout , ale pokud je ModelState
hodnota nastavena na ,ModelState
hodnota má přednost a je vrácena do zobrazení.
ModelState
Vzhledem k tomu, že hodnota nastavená na je hodnota odeslaná zadáním pohledu atd., Z hlediska InputValue
modelu, , ResultValue1
je nastavena.
ResultValue1
Proto má přednost hodnota a ModelState
hodnota nastavená v modelu,ModelState
která není ResultValue2
nastavena na, se zobrazí v zobrazení.
Vrácení hodnoty do zobrazení ve prospěch hodnoty modelu
ModelState
Hodnoty nastavené tak, aby měly přednost před zobrazením, takže pokud ModelState
vymažete hodnoty nastavené na , hodnota modelu se vrátí do zobrazení.
ModelState.Clear()
Všechny hodnoty, které má, můžete vymazat voláním následujícím způsobemModelState
:
[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
program také provádí proces ověření,ModelState.Clear
takže si jej při ModelState.IsValid
volání přečtěte po volání .
Po spuštění se výsledek zobrazí správně následujícím způsobem.
ModelState.Clear
Vzhledem k tomu, že všechny hodnoty zmizí při volání metody, je také možné zadat název vlastnosti modelu a vymazat hodnoty jednotlivě následujícím způsobem.
[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);
}