Odráža hodnotu zmenenú v akcii po zaúčtovaní formulára v zobrazení
životné prostredie
- Vizuálne štúdio
-
- Visual Studio 2022
- jadro ASP.NET
-
- 6.0 MVC
Funguje v iných prostrediach, ako je uvedené vyššie, ale publikovaný kód bol napísaný v rámci vyššie.
Čo urobiť
Pokúste sa vytvoriť jednoduchý program, ktorý hovorí: "Uverejnite text, ktorý ste zadali na obrazovke, a vráťte spracovaný text na rovnakú obrazovku ako nový výsledok."
kód
Základom je vytvorenie nového projektu MVC, z ktorého pridáte kód. Kód je zverejnený pre celkovú konfiguráciu, preto si ho prosím prečítajte.
Model (viewmodel)
Vytvorte nasledujúci model interakcie zobrazenia a akcie: ResultValue
Sú dva, ale chcel som dať dva výsledky v výhľade, takže som pripravil 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; }
}
}
akcia
Je to jednoduchý proces: zobrazte zobrazenie, vezmite text zadaný v POST, spracujte ho a vrátite výsledok.
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);
}
}
}
pohľad
Vytvárajte zobrazenia na základe akcií a modelov.
Keď kliknete ResultValue1
na tlačidlo aktualizácie a ResultValue2
zobrazia sa, ale zobrazia sa v "vstupnom texte" a "v potápačskej značke".
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
Pridajte prepojenie, aby ste mohli prejsť z Sample
položky .
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> @* 追加 *@
Aktualizácia modelu prijatého v procese POST nemá vplyv na vstup zobrazenia atď.
Spustite kód, ktorý ste vytvorili vyššie, zadajte z InputValue
obrazovky Ukážka a pokúste sa aktualizovať.
Na strane akcie, ResultValue1
pretože hodnoty sú nastavené a ResultValue2
vrátené, predpokladá sa, že obe sú pôvodne zobrazené, ale v skutočnosti div
sa zobrazia iba 2 množiny v značke.
Hodnota nastavená na ModelState má prednosť
Keď klient POST vstupnú hodnotu, hodnota je nastavená na premennú modelu argumentu ControllerBase.ModelState
, ale hodnota je tiež nastavená.
Zadaná hodnota sa ModelState
potom overí s hodnotou nastavenou na . ModelState.IsValid
To je dôvod, prečo je súdený v.
Pri ladení môžete skontrolovať obsah zastavením spracovania v bode prerušenia.
Ak chcete pôvodne vrátiť hodnotu do zobrazenia, je return View(model);
v poriadku zahrnúť , ale ak je ModelState
hodnota nastavená na hodnotu ,ModelState
hodnota má prednosť a vráti sa do zobrazenia.
ModelState
Keďže nastavená hodnota je hodnota odoslaná zadaním zobrazenia atď., Pokiaľ ide o InputValue
model, ResultValue1
je nastavená.
PretoResultValue1
hodnota má ModelState
prednosť a hodnota nastavená v modeli,ModelState
ktorý nie ResultValue2
je nastavený na zobrazenie, sa zobrazí v zobrazení.
Vrátenie hodnoty do zobrazenia v prospech hodnoty modelu
ModelState
Hodnoty nastavené tak, aby mali prednosť pred zobrazením, takže ak ModelState
vymažete hodnoty nastavené na , hodnota modelu sa vráti do zobrazenia.
ModelState.Clear()
Všetky hodnoty, ktoré majú, môžete vymazať takModelState
, že zavoláte takto:
[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
tiež vykonáva proces overenia,ModelState.Clear
takže si ho nezabudnite ModelState.IsValid
prečítať po volaní .
Keď ho spustíte, výsledok sa zobrazí správne takto.
ModelState.Clear
Keďže všetky hodnoty zmiznú, keď zavoláte metódu, je tiež možné zadať názov vlastnosti modelu a vymazať hodnoty jednotlivo nasledovne.
[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);
}