שיקוף הערך שהשתנה בפעולה לאחר הצבת הטופס בתצוגה

תאריך יצירת דף :

סביבה

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);
}