منعکس کردن مقدار تغییر یافته در عمل پس از فرم در نظر
محیط
- ویژوال استودیو
-
- ویژوال استودیو 2022
- ASP.NET هسته
-
- 6.0 MVC
در محیط هایی غیر از موارد بالا کار می کند، اما کد منتشر شده در چارچوب بالا نوشته شده است.
چه باید کرد
سعی کنید یک برنامه ساده ایجاد کنید که می گوید: «متنی را که روی صفحه تایپ کرده بودید کنید و متن پردازش شده را به همان صفحه نمایش یک نتیجه جدید برگردانید.»
کد
پایه ایجاد یک پروژه MVC جدید است، که از آن کد اضافه می کنید. کد برای پیکربندی کلی منتشر شده است، بنابراین لطفا به آن مراجعه کنید.
مدل (viewmodel)
مدل زیر را برای تعامل دید و عمل ایجاد کنید: ResultValue
دو تا هست، اما می خواستم دو نتیجه از نظر بدهم، بنابراین دو تا آماده کردم.
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; }
}
}
اقدام
این یک فرایند ساده است: دریافت برای نمایش نمایش، گرفتن متن وارد شده در 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
عمل، از آنجا که مقادیر تنظیم شده اند و برگردانده می شوند، فرض بر این است که هر دو در اصل نمایش داده می شوند، اما در واقع تنها مجموعه ۲ در تگ نمایش داده می شوند.
مجموعه ارزش به 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);
}