Atspindėti reikšmę, pakeistą veiksme po formos įrašo rodinyje
Aplinkos
- Visual Studio
-
- Visual Studio 2022
- ASP.NET branduolys
-
- 6,0 MVC
Jis veikia kitose aplinkose nei pirmiau, tačiau paskelbtas kodas buvo parašytas aukščiau pateiktoje sistemoje.
Ką daryti
Pabandykite sukurti paprastą programą, kurioje sakoma: "Paskelbkite tekstą, kurį įvedėte ekrane, ir grąžinkite apdorotą tekstą į tą patį ekraną kaip ir naują rezultatą".
Kodas
Pagrindas yra naujo MVC projekto, iš kurio pridedate kodą, kūrimas. Kodas skelbiamas bendrai konfigūracijai, todėl prašome kreiptis į jį.
Modelis (viewmodel)
Sukurkite šį rodinio ir veiksmo veiksmų modelį: ResultValue
Yra du, bet aš norėjau duoti du rezultatus nuomone, todėl aš paruošiau du.
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; }
}
}
veiksmas
Tai paprastas procesas: gauti rodyti rodinį, paimti POST įvestą tekstą, apdoroti jį ir grąžinti rezultatą.
PradžiaKontroleris
// 省略
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);
}
}
}
rodinys
Kurti rodinius pagal veiksmus ir modelius.
ResultValue1
Spustelėjus naujinimo mygtuką ir ResultValue2
jį rodant, jie rodomi atitinkamai "įvesties tekste" ir "div žymoje".
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
Įtraukite saitą, kad galėtumėte pereiti iš 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> @* 追加 *@
POST proceso metu gauto modelio atnaujinimas neturi įtakos rodinio įvestims ir pan.
Paleiskite aukščiau sukurtą kodą, įveskite ekraną InputValue
Pavyzdys ir bandykite naujinti.
Veiksmo pusėje, ResultValue1
kadangi reikšmės yra nustatytos ir ResultValue2
grąžintos, daroma prielaida, kad abi iš pradžių rodomos, tačiau iš tikrųjų div
rodomos tik 2, nustatytos žymoje.
Pirmenybė teikiama "ModelState" nustatytai reikšmei
Kai klientas NUSTATO įvesties vertę, vertė nustatoma kaip argumento ControllerBase.ModelState
modelio kintamasis, tačiau taip pat nustatoma vertė.
Tada įvesta ModelState
reikšmė tikrinama, kai reikšmė nustatyta kaip . ModelState.IsValid
Štai kodėl jis yra vertinamas.
Derindami galite patikrinti turinį sustabdydami apdorojimą lūžio taške.
Jei iš pradžių norite grąžinti reikšmę į rodinį, gerai return View(model);
įtraukti , bet jei reikšmė ModelState
nustatyta kaip ,ModelState
reikšmė yra viršesnė ir grąžinama į rodinį.
ModelState
Kadangi nustatyta reikšmė yra reikšmė, siunčiama įvedant rodinį ir t. t., modelio požiūriu InputValue
, ResultValue1
nustatoma.
TodėlResultValue1
pirmenybė teikiama ModelState
reikšmei,ModelState
o rodinyje rodoma modelio, kurio nenustatyta ResultValue2
, reikšmė.
Reikšmės grąžinimas rodiniui modelio reikšmės naudai
ModelState
Reikšmės, nustatytos taip, kad pirmenybė būtų teikiama rodiniui, taigi, jei ModelState
ištrinsite nustatytas reikšmes , modelio reikšmė bus grąžinta į rodinį.
ModelState.Clear()
Galite ištrinti visas reikšmes, kurias turite skambindami ModelState
taip:
[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
taip pat atlieka tikrinimo procesą, todėl būtinai perskaitykite ModelState.IsValid
jį po to,ModelState.Clear
kai skambinate .
Kai jį paleisite, rezultatas bus rodomas teisingai.
ModelState.Clear
Kadangi visos reikšmės išnyksta, kai skambinate metodu, taip pat galima nurodyti modelio ypatybių pavadinimą ir ištrinti reikšmes atskirai.
[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);
}