Phản ánh giá trị đã thay đổi trong hành động sau bài đăng của biểu mẫu trong dạng xem

Ngày tạo trang :

môi trường

Visual Studio
  • Visual Studio 2022
Lõi ASP.NET
  • 6.0 MVC

Nó hoạt động trong các môi trường khác với những điều trên, nhưng mã được xuất bản đã được viết trong khuôn khổ trên.

Phải làm gì

Cố gắng tạo một chương trình đơn giản có nội dung: "Đăng văn bản bạn đã nhập trên màn hình và trả lại văn bản đã xử lý về cùng một màn hình như một kết quả mới."

Cơ sở là việc tạo ra một dự án MVC mới, từ đó bạn thêm mã. Mã được xuất bản cho cấu hình tổng thể, vì vậy vui lòng tham khảo nó.

Model (viewmodel)

Tạo mô hình sau đây để xem và tương tác hành động: ResultValue Có hai, nhưng tôi muốn đưa ra hai kết quả trong quan điểm, vì vậy tôi đã chuẩn bị hai.

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

hành động

Đó là một quá trình đơn giản: hiển thị chế độ xem, lấy văn bản được nhập vào POST, xử lý và trả về kết quả.

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

cảnh

Tạo chế độ xem dựa trên hành động và mô hình.

Khi bạn ResultValue1 nhấp vào nút cập nhật và ResultValue2 được hiển thị, nhưng chúng được hiển thị trong "văn bản nhập liệu" và "trong thẻ div", tương ứng.

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 Thêm nối kết để bạn có thể chuyển từ Sample sang .

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>    @* 追加 *@

Cập nhật mô hình nhận được trong quy trình POST không ảnh hưởng đến đầu vào của chế độ xem, v.v.

Chạy mã bạn đã tạo ở trên, nhập từ InputValue màn hình Mẫu và cố gắng cập nhật.

Về mặt hành động, ResultValue1 vì các giá trị được đặt và ResultValue2 trả về, người ta cho rằng cả hai đều được hiển thị ban đầu, nhưng trên thực tế div chỉ có 2 tập hợp trong thẻ được hiển thị.

Giá trị được đặt thành ModelState được ưu tiên

Khi máy khách POSTs giá trị đầu vào, giá trị được đặt thành biến mô hình của đối số ControllerBase.ModelState , nhưng giá trị cũng được đặt. Giá trị được nhập sau đó được ModelState xác nhận với giá trị được đặt thành . ModelState.IsValid Đó là lý do tại sao nó được đánh giá trong. Khi gỡ lỗi, bạn có thể kiểm tra nội dung bằng cách ngừng xử lý tại điểm ngắt.

Nếu ban đầu bạn muốn trả về giá trị cho dạng xem, bạn có return View(model); thể bao gồm , nhưng nếu một giá trị được đặt thành ModelState ,ModelState giá trị của được ưu tiên và được trả về dạng xem.

ModelState Vì giá trị được đặt thành là một giá trị được gửi bằng cách nhập dạng xem, v.v., về mặt InputValuemô hình, , ResultValue1 được đặt. Do đó,ResultValue1 giá trị của được ModelState ưuModelState tiên và giá trị được đặt trong mô hình không ResultValue2 được đặt thành được hiển thị trong dạng xem.

Để trả về giá trị cho dạng xem có lợi cho giá trị mô hình

ModelState Các giá trị được đặt để ưu tiên cho dạng xem, vì vậy nếu ModelState bạn xóa các giá trị được đặt thành , giá trị của mô hình sẽ được trả về dạng xem.

ModelState.Clear() Bạn có thể xóa tất cả các giá trị có bằng cách ModelState gọi như sau:

[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 cũng đang thực hiện quy trình xác thực,ModelState.Clear vì vậy hãy chắc chắn ModelState.IsValid đọc nó sau khi bạn gọi .

Khi bạn chạy nó, kết quả sẽ được hiển thị chính xác như sau.

ModelState.Clear Vì tất cả các giá trị biến mất khi bạn gọi một phương thức, bạn cũng có thể chỉ định tên thuộc tính của mô hình và xóa các giá trị riêng lẻ như sau.

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