Atspoguļot vērtību, kas mainīta darbībā pēc formas publicēšanas skatā
vide
- Vizuālā studija
-
- Vizuālā studija 2022
- ASP.NET kodols
-
- 6.0 MVC
Tas darbojas vidē, kas nav iepriekš minētā, bet publicētais kods tika rakstīts iepriekš minētajā kontekstā.
Ko darīt
Mēģiniet izveidot vienkāršu programmu, kurā teikts: "Ievietojiet ekrānā ierakstīto tekstu un atgrieziet apstrādāto tekstu tajā pašā ekrānā, kurā ir jauns rezultāts."
kods
Pamatā ir jauna MVC projekta izveide, no kura jūs pievienojat kodu. Kods ir publicēts vispārējai konfigurācijai, tāpēc, lūdzu, skatiet to.
Modelis (viewmodel)
Izveidojiet šādu skata un darbības mijiedarbības modeli: ResultValue
Ir divi, bet es gribēju sniegt divus rezultātus skatījumā, tāpēc es sagatavoju divus.
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; }
}
}
darbība
Tas ir vienkāršs process: parādīt skatu, paņemt post ievadīto tekstu, apstrādāt to un atgriezt rezultātu.
SākumsKontrollers
// 省略
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);
}
}
}
skats
Izveidojiet skatus, pamatojoties uz darbībām un modeļiem.
ResultValue1
Noklikšķinot uz atjaunināšanas pogas, un ResultValue2
tie tiek parādīti, bet tie tiek parādīti attiecīgi "ievades tekstā" un "div tagā".
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
Pievienojiet saiti, lai varētu pāriet no Sample
programmas uz .
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 procesā saņemtā modeļa atjaunināšana neietekmē skata ievadi utt.
Palaidiet iepriekš izveidoto kodu, ievadiet no InputValue
parauga ekrāna un mēģiniet atjaunināt.
Darbības pusē, ResultValue1
tā kā vērtības ir iestatītas un ResultValue2
atgrieztas, tiek pieņemts, ka abas sākotnēji tiek rādītas, bet patiesībā div
tiek parādītas tikai 2 tagā iestatītās kopas.
Uz ModelState iestatītajai vērtībai ir prioritāte
Kad klients POSTs ievades vērtību, vērtība tiek iestatīta uz modeļa mainīgo ControllerBase.ModelState
argumenta, bet vērtība ir arī iestatīta.
Ievadītā vērtība pēc tam tiek ModelState
validēta ar vērtību, kas iestatīta uz . ModelState.IsValid
Tāpēc tas tiek vērtēts.
Atkļūdojot, varat pārbaudīt saturu, pārtraucot apstrādi pārtraukumpunktā.
Ja sākotnēji vēlaties atgriezt vērtību skatā, ir return View(model);
labi iekļaut , bet, ja vērtība ir ModelState
iestatīta uz ,ModelState
vērtība ir prioritāra un tiek atgriezta skatā.
ModelState
Tā kā iestatītā vērtība ir vērtība, kas nosūtīta, ievadot skatu utt. modeļa izteiksmē InputValue
, ResultValue1
ir iestatīta.
Tāpēc skatā tiek parādīta vērtība,ResultValue1
kurai ir ModelState
prioritāte, un skatā tiek parādīta vērtība,ModelState
kas iestatīta modelī, uz kuru nav ResultValue2
iestatīta.
Lai atgrieztu vērtību skatā par labu modeļa vērtībai
ModelState
Vērtības, kas iestatītas kā prioritāras attiecībā pret skatu, tāpēc, ja ModelState
izdzēsīsit vērtības, uz kurām iestatītās vērtības, modeļa vērtība tiks atgriezta skatā.
ModelState.Clear()
Visas vērtības, kas ir, var izdzēst, zvanot ModelState
šādi:
[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
veic arī validācijas procesu, tāpēc noteikti ModelState.IsValid
izlasiet to pēc tam,ModelState.Clear
kad zvanāt .
Palaižot to, rezultāts tiks parādīts pareizi šādi.
ModelState.Clear
Tā kā visas vērtības pazūd, izsaucot metodi, ir iespējams arī norādīt modeļa rekvizīta nosaukumu un izdzēst vērtības atsevišķi šādi.
[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);
}