Отразяване на стойността, променена в действието след публикацията на формуляра в изгледа
околна среда
- Визуално студио
-
- Визуално студио 2022
- ASP.NET Ядро
-
- 6.0 MVC
Той работи в среди, различни от горепосочените, но публикуваният код е написан в рамката по-горе.
Какво да направите
Опитайте се да създадете проста програма, която казва: "Публикувайте текста, който сте въвели на екрана, и върнете обработения текст на същия екран като нов резултат."
код
Базата е създаването на нов MVC проект, от който добавяте код. Кодът се публикува за цялостната конфигурация, така че моля, вижте го.
Модел (модел на изглед)
Създайте следния модел за взаимодействие с изглед и действие: ResultValue
Има два, но исках да дам два резултата в гледката, затова подготвих два.
ПримеренВюМодел
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; }
}
}
действие
Това е прост процес: да получите за показване на изгледа, да вземете текста, въведен в POST, да го обработите и да върнете резултата.
НачалоКонтролер
// 省略
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);
}
}
}
изглед
Създаване на изгледи въз основа на действия и модели.
Когато ResultValue1
щракнете върху бутона за актуализация, и ResultValue2
се показват, но те се показват в "входен текст" и "в div етикет", съответно.
Проба.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
Добавете връзка, така че да можете да преминавате от Sample
към .
Индекс.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, не влияе на входа на изгледа и т.н.
Изпълнете кода, който създадохте по-горе, въведете от InputValue
екрана Проба и се опитайте да актуализирате.
От страна на действието, ResultValue1
тъй като стойностите са зададени на и ResultValue2
върнати, се приема, че и двете първоначално се показват, но всъщност div
се показват само наборът 2 в маркера.
Стойността, зададена на ModelState, има предимство
Когато клиентът POSTs входната стойност, стойността е зададена на променливата на модела на аргумента ControllerBase.ModelState
, но стойността също е зададена.
Въведената стойност след това се ModelState
валидира със стойността, зададена на . ModelState.IsValid
Ето защо тя се съди в.
При отстраняване на грешки можете да проверите съдържанието, като спрете обработката в точката на прекъсване.
Ако първоначално искате да върнете стойност в изгледа, е return View(model);
OK да включите , но ако е зададена стойност ModelState
на ,ModelState
стойността на има предимство и се връща към изгледа.
ModelState
Тъй като стойността, зададена на е стойност, изпратена чрез въвеждане на изгледа и т.н., по отношение на InputValue
модела, , ResultValue1
е зададена.
ЗатоваResultValue1
стойността на има ModelState
предимство и стойността,ModelState
зададена в модела, който не ResultValue2
е зададен на се показва в изгледа.
За да върнете стойност в изглед в полза на стойност на модел
ModelState
Стойности, зададени да вземат предимство на изгледа, така че ако ModelState
изтриете стойностите, зададени на , стойността на модела ще бъде върната на изгледа.
ModelState.Clear()
Можете да изтриете всички стойности, които имат, ModelState
като се обадите, както следва:
[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
също прави процеса на валидиране,ModelState.Clear
така че не забравяйте ModelState.IsValid
да го прочетете, след като се обадите .
Когато го стартирате, резултатът ще се покаже правилно, както следва.
ModelState.Clear
Тъй като всички стойности изчезват, когато наричате метод, също така е възможно да укажете името на свойството на модела и да изтриете стойностите поотделно, както следва.
[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);
}