منظر میں فارم کے بعد عمل میں تبدیل شدہ قدر کی عکاسی کریں

صفحہ تخلیق تاریخ :

ماحول

بصری سٹوڈیو
  • ویژیول سٹوڈیو 2022
ASP.NET کور
  • 6.0 ایم وی سی

یہ مندرجہ بالا کے علاوہ دیگر ماحول میں کام کرتا ہے، لیکن شائع شدہ ضابطہ اوپر فریم ورک میں لکھا گیا تھا۔

کیا بنانا ہے

ایک سادہ پروگرام بنانے کی کوشش کریں جس میں کہا گیا ہو کہ "سکرین پر ٹائپ کردہ متن پوسٹ کریں اور پروسیس شدہ متن کو ایک نئے نتیجے کے طور پر اسی سکرین پر واپس کریں۔

ضابطہ

بنیاد ایک نئے ایم وی سی پروجیکٹ کی تخلیق ہے، جس سے آپ کوڈ شامل کرتے ہیں۔ کوڈ مجموعی تشکیل کے لیے شائع کیا گیا ہے، لہذا براہ کرم اس کا حوالہ دیں۔

نمونہ (منظر ماڈل)

منظر اور عمل تعامل کے لیے درج ذیل نمونہ بنائیں: ResultValue دو ہیں، لیکن میں اس منظر میں دو نتائج دینا چاہتا تھا، لہذا میں نے دو تیار کیے۔

نمونہ منظر نمونہ

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

عمل

یہ ایک آسان عمل ہے: منظر دکھانے کے لئے حاصل کریں، پوسٹ میں درج متن لیں، اس پر عمل کریں، اور نتیجہ واپس کریں۔

ہوم کنٹرولر

// 省略

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 دکھائے جاتے ہیں، لیکن انہیں بالترتیب "ان پٹ ٹیکسٹ" اور "ان ڈائیو ٹیگ" میں دکھایا جاتا ہے۔

نمونہ.سی ایس ایچ ٹی ایم ایل

@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 منتقل ہو سکیں۔

اشاریہ.سی ایس ایچ ٹی ایم ایل

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

پوسٹ کے عمل میں موصول ہونے والے ماڈل کو اپ ڈیٹ کرنے سے منظر کے ان پٹ وغیرہ پر کوئی اثر نہیں پڑتا۔

اوپر بنایا گیا کوڈ چلائیں، نمونہ سکرین سے InputValue داخل کریں اور تازہ کاری کی کوشش کریں۔

ایکشن سائیڈ پر، ResultValue1 چونکہ اقدار طے کی جاتی ہیں اور ResultValue2 واپس کی جاتی ہیں، یہ فرض کیا جاتا ہے کہ دونوں اصل میں دکھائے جاتے ہیں، لیکن درحقیقت div ٹیگ میں صرف 2 سیٹ دکھائے جاتے ہیں۔

ماڈل اسٹیٹ کے لئے سیٹ کی قدر کو ترجیح دی جاتی ہے

جب کلائنٹ ان پٹ ویلیو پی او ایس ٹی کرتا ہے تو قدر دلیل کے ماڈل متغیر 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);
}