שיקוף הערך שהשתנה בפעולה לאחר הצבת הטופס בתצוגה
סביבה
- Visual Studio
-
- Visual Studio 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, לעבד אותו ולהחזיר את התוצאה.
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);
}
}
}
נוף
צור תצוגות המבוססות על פעולות ומודלים.
ResultValue1
בעת לחיצה על לחצן העדכון, והם ResultValue2
מוצגים, אך הם מוצגים ב"טקסט קלט " ו"בתג div ", בהתאמה.
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
הוסף קישור כך שתוכל לעבור מ- 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 אינו משפיע על קלט התצוגה וכו '.
הפעל את הקוד שיצרת לעיל, הזן מהמסך InputValue
לדוגמה ונסה לעדכן.
בצד הפעולה, ResultValue1
מכיוון שהערכים מוגדרים ומוחזרים ResultValue2
, ההנחה היא ששניהם מוצגים במקור, אך למעשה div
רק 2 הערכות בתג מוצגות.
הערך המוגדר כ- ModelState מקבל קדימות
כאשר הלקוח POSTs ערך הקלט, הערך מוגדר למשתנה המודל של ControllerBase.ModelState
הארגומנט, אך הערך מוגדר גם הוא.
הערך שהוזן מאומת ModelState
לאחר מכן כאשר הערך מוגדר כ . ModelState.IsValid
לכן זה נשפט.
בעת איתור באגים, באפשרותך לבדוק את התוכן על-ידי הפסקת העיבוד בנקודת העצירה.
אם במקור ברצונך להחזיר ערך לתצוגה, זה return View(model);
בסדר לכלול , אך אם ערך מוגדר 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);
}