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
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."
mã
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 InputValue
mô 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);
}