Odraža vrednost, spremenjeno v dejanju po objavi obrazca v pogledu
okolje
- Vizualni studio
-
- Vizualni studio 2022
- ASP.NET Jedro
-
- 6.0 MVC
Deluje v drugih okoljih, kot je navedeno, vendar je bila objavljena koda zapisana v zgornjem okviru.
Kaj narediti
Poskusite ustvariti preprost program, ki pravi: "Objavite besedilo, ki ste ga vtipkali na zaslonu in vrnite obdelano besedilo na isti zaslon kot nov rezultat."
koda
Osnova je izdelava novega projekta MVC, iz katerega dodajate kodo. Koda je objavljena za celotno konfiguracijo, zato si jo poglejte.
Model (viewmodel)
Ustvarite ta model za ogled in interakcijo z dejanji: ResultValue
Dva sta, vendar sem želel dati dva izida v stališču, zato sem 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; }
}
}
dejanje
Gre za preprost postopek: prikažete pogled, vzamete besedilo, vneseno v POST, ga obdelate in vrnete rezultat.
DomovKontrolar
// 省略
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);
}
}
}
Pogled
Ustvarite poglede na podlagi dejanj in modelov.
Ko kliknete ResultValue1
gumb za ResultValue2
posodobitev in so prikazani, vendar so prikazani v »vnosnem besedilu« oziroma »v div oznaki«.
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
Dodajte povezavo, tako da lahko prehajate iz Sample
.
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> @* 追加 *@
Posodabljanje modela, prejetega v post postopku, ne vpliva na vnos pogleda itd.
Zaženite zgoraj ustvarjeno kodo, vnesite na vzorčni InputValue
zaslon in poskusite posodobiti.
Na strani dejanja, ResultValue1
ResultValue2
ker so vrednosti nastavljene na in vrnjene, se domneva, da sta oba prvotno prikazana, div
v resnici pa sta prikazana le 2 nabora v oznaki.
Prednost ima vrednost, nastavljena na ModelState
Ko odjemalec POSTs vhodno vrednost, je vrednost nastavljena na spremenljivko modela ControllerBase.ModelState
argumenta, vrednost pa je nastavljena tudi.
Vnesena vrednost se ModelState
nato potrdi z vrednostjo, nastavljeno na . ModelState.IsValid
Zato je tudi sodilno.
Pri odpravljanju napak lahko vsebino preverite tako, da ustavite obdelavo na prelomni točki.
Če želite prvotno vrniti vrednost v pogled, return View(model);
je v redu, da vključite , ModelState
če pa je vrednost nastavljena na ,ModelState
ima vrednost prednost in se vrne v pogled.
ModelState
Ker je nastavljena vrednost vrednost, poslana z vnosom pogleda itd., InputValue
v smislu modela, je ResultValue1
nastavljena.
Zato imaResultValue1
ModelState
ModelState
vrednost prednost in vrednost, nastavljena v modeluResultValue2
, ki ni nastavljen na, je prikazana v pogledu.
Vračanje vrednosti v pogled v korist vrednosti modela
ModelState
Vrednosti, nastavljene tako, da bodo imele prednost v pogledu, ModelState
tako da če izbrišete vrednosti, nastavljene na , bo vrednost modela vrnjena v pogled.
ModelState.Clear()
Vse vrednosti, ki jih imate, lahko izbrišete ModelState
tako, da pokličete na naslednji način:
[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
prav tako dela postopek preverjanja veljavnosti, zato ModelState.IsValid
se prepričajte,ModelState.Clear
da ga preberite po tem, ko pokličete .
Ko ga zaženete, bo rezultat pravilno prikazan na naslednji način.
ModelState.Clear
Ker vse vrednosti izginejo, ko pokličete metodo, je mogoče določiti tudi ime lastnosti modela in izbrisati vrednosti posebej, kot sledi.
[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);
}