منعکس کردن مقدار تغییر یافته در عمل پس از فرم در نظر

تاریخ ایجاد صفحه :

محیط

ویژوال استودیو
  • ویژوال استودیو 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); ModelStateModelState اصل می خواهید مقداری را به نمایش برگردانید، خوب است که شامل آن شود، اما اگر مقداری برای آن تنظیم شود، مقدار طول می کشد و به نمایش بازگردانده می شود.

ModelStateاز آنجا که مقدار مجموعه به مقدار ارسال شده توسط ورودی InputValueمشاهده ، و غیره ، از نظر مدل ، ، تنظیم ResultValue1 شده است. بنابراین مقدار تقدمResultValue1 می ModelStateModelState 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);
}