Reflectarea valorii modificate în acțiunea după postarea formularului în vizualizare
mediu
- Visual Studio
-
- Visual Studio 2022
- nucleul ASP.NET
-
- 6,0 MVC
Funcționează în alte medii decât cele de mai sus, dar codul publicat a fost scris în cadrul de mai sus.
Ce să faci
Încercați să creați un program simplu care spune: "Postați textul pe care l-ați tastat pe ecran și returnați textul procesat pe același ecran ca rezultat nou."
cod
Baza este crearea unui nou proiect MVC, din care adăugați cod. Codul este publicat pentru configurația generală, așa că vă rugăm să consultați-l.
Model (viewmodel)
Creați următorul model pentru interacțiunea de vizualizare și acțiune: ResultValue
Sunt două, dar am vrut să dau două rezultate în punct de vedere, așa că am pregătit două.
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; }
}
}
acțiune
Este un proces simplu: ajungeți să afișați vizualizarea, să luați textul introdus în POST, să-l procesați și să returnați rezultatul.
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);
}
}
}
vedere
Creați vizualizări pe baza acțiunilor și modelelor.
Când faceți ResultValue1
clic pe butonul de actualizare, și ResultValue2
sunt afișate, dar acestea sunt afișate în "text de intrare" și "în div tag-ul", respectiv.
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
Adăugați un link, astfel încât să puteți trece de la la 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> @* 追加 *@
Actualizarea modelului primit în procesul POST nu afectează introducerea vizualizării etc.
Rulați codul pe care l-ați creat mai sus, introduceți din InputValue
ecranul Eșantion și încercați să actualizați.
Pe partea de acțiune, ResultValue1
deoarece valorile sunt setate și ResultValue2
returnate, se presupune că ambele sunt afișate inițial, dar, de fapt div
, se afișează numai cele 2 setate în etichetă.
Valoarea setată la ModelState are prioritate
Când clientul POSTs valoarea de intrare, valoarea este setată la variabila model a argumentului ControllerBase.ModelState
, dar valoarea este, de asemenea, setată.
Valoarea introdusă este ModelState
apoi validată cu valoarea setată la . ModelState.IsValid
De aceea este judecat în.
Când depanați, puteți verifica conținutul oprind procesarea la punctul de întrerupere.
Dacă inițial doriți să returnați o valoare vizualizării, este return View(model);
OK să includeți , dar dacă o valoare este ModelState
setată la ,ModelState
valoarea are prioritate și este returnată la vizualizare.
ModelState
Deoarece valoarea setată la este o valoare trimisă prin introducerea vizualizării etc., în ceea ce privește InputValue
modelul, , ResultValue1
este setată.
De aceea,ResultValue1
valoarea are ModelState
prioritate și valoarea setatăModelState
în modelul care nu ResultValue2
este setat la se afișează în vizualizarea.
Pentru a returna o valoare la o vizualizare în favoarea unei valori model
ModelState
Valorile setate să aibă prioritate față de vizualizare, deci dacă ModelState
ștergeți valorile setate la , valoarea modelului va fi returnată la vizualizare.
ModelState.Clear()
Puteți șterge toate valorile pe care le are ModelState
apelând după cum urmează:
[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
face, de asemenea, procesul de validare,ModelState.Clear
deci asigurați-vă că ModelState.IsValid
îl citiți după ce sunați .
Când îl executați, rezultatul va fi afișat corect după cum urmează.
ModelState.Clear
Deoarece toate valorile dispar atunci când apelați o metodă, este de asemenea posibil să specificați numele proprietății modelului și să ștergeți valorile individual, după cum urmează.
[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);
}