Mencerminkan nilai yang diubah dalam tindakan selepas siaran borang dalam pandangan
Persekitaran
- Visual Studio
-
- Studio Visual 2022
- Teras ASP.NET
-
- 6.0 MVC
Ia berfungsi dalam persekitaran selain daripada yang di atas, tetapi kod yang diterbitkan ditulis dalam rangka kerja di atas.
Apa yang perlu dibuat
Cuba buat program mudah yang mengatakan, "Siarkan teks yang anda taip pada skrin dan kembalikan teks yang diproses ke skrin yang sama dengan hasil baru."
Kod
Asasnya ialah penciptaan projek MVC baru, dari mana anda menambah kod. Kod ini diterbitkan untuk konfigurasi keseluruhan, jadi sila rujuknya.
Model (viewmodel)
Cipta model berikut untuk interaksi pandangan dan tindakan: ResultValue
Terdapat dua, tetapi saya mahu memberikan dua keputusan dalam pandangan, jadi saya menyediakan dua.
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; }
}
}
Tindakan
Ini adalah proses yang mudah: dapatkan paparan paparan, ambil teks yang dimasukkan dalam POST, proseskannya, dan kembalikan hasilnya.
UtamaPengawal
// 省略
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);
}
}
}
Lihat
Buat pandangan berdasarkan tindakan dan model.
Apabila anda ResultValue1
mengklik butang kemas kini, dan ResultValue2
dipaparkan, tetapi ia dipaparkan dalam "teks input" dan "dalam tag div", masing-masing.
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
Tambah pautan supaya anda boleh beralih dari Sample
ke .
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> @* 追加 *@
Mengemas kini model yang diterima dalam proses POST tidak menjejaskan input pandangan, dsb.
Jalankan kod yang anda buat di atas, masukkan dari InputValue
contoh skrin, dan cuba kemas kini.
Di sisi tindakan, ResultValue1
kerana nilai ditetapkan dan ResultValue2
dikembalikan, diandaikan bahawa kedua-duanya pada asalnya dipaparkan, tetapi sebenarnya div
hanya 2 yang ditetapkan dalam tag dipaparkan.
Nilai yang ditetapkan ke ModelState diutamakan
Apabila pelanggan MEMPUNYAI nilai input, nilai ditetapkan kepada pemboleh ubah ControllerBase.ModelState
model hujah, tetapi nilai juga ditetapkan.
Nilai yang ModelState
dimasukkan kemudian disahkan dengan nilai yang ditetapkan kepada . ModelState.IsValid
Itulah sebabnya ia dihakimi.
Apabila penyahpepijatan, anda boleh menyemak kandungan dengan menghentikan pemprosesan pada titik putus.
Jika anda pada asalnya ingin mengembalikan nilai kepada pandangan, ia adalah return View(model);
OK untuk disertakan , tetapi jika nilai ModelState
disetkan kepada ,ModelState
nilai mengambil keutamaan dan dikembalikan kepada pandangan.
ModelState
Oleh kerana nilai yang ditetapkan adalah nilai yang dihantar dengan memasukkan pandangan, dan lain-lain, dari segi InputValue
model, , ResultValue1
ditetapkan.
Oleh itu,ResultValue1
nilai mengambil ModelState
keutamaan,ModelState
dan nilai yang ditetapkan dalam model yang tidak ResultValue2
ditetapkan dipaparkan dalam paparan.
Untuk mengembalikan nilai kepada pandangan yang memihak kepada nilai model
ModelState
Nilai yang ditetapkan untuk diutamakan kepada pandangan, jadi jika ModelState
anda memadamkan nilai yang ditetapkan kepada , nilai model akan dikembalikan kepada paparan.
ModelState.Clear()
Anda boleh memadamkan semua nilai yang ada dengan ModelState
memanggil seperti berikut:
[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
juga melakukan proses pengesahan,ModelState.Clear
jadi pastikan anda ModelState.IsValid
membacanya selepas apabila anda memanggil .
Apabila anda menjalankannya, hasilnya akan dipaparkan dengan betul seperti berikut.
ModelState.Clear
Oleh kerana semua nilai hilang apabila anda memanggil kaedah, ia juga mungkin untuk menentukan nama sifat model dan memadamkan nilai secara individu seperti berikut.
[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);
}