منظر میں فارم کے بعد عمل میں تبدیل شدہ قدر کی عکاسی کریں
ماحول
- بصری سٹوڈیو
-
- ویژیول سٹوڈیو 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);
}