এএসপি.নেট এমভিসি - কীভাবে মডেলস্টেট ত্রুটিগুলি রিডাইরেক্টটঅ্যাকশন জুড়ে সংরক্ষণ করবেন?


92

আমার কাছে নিম্নলিখিত দুটি ক্রিয়া পদ্ধতি রয়েছে (প্রশ্নের জন্য সরলীকৃত):

[HttpGet]
public ActionResult Create(string uniqueUri)
{
   // get some stuff based on uniqueuri, set in ViewData.  
   return View();
}

[HttpPost]
public ActionResult Create(Review review)
{
   // validate review
   if (validatedOk)
   {
      return RedirectToAction("Details", new { postId = review.PostId});
   }  
   else
   {
      ModelState.AddModelError("ReviewErrors", "some error occured");
      return RedirectToAction("Create", new { uniqueUri = Request.RequestContext.RouteData.Values["uniqueUri"]});
   }   
}

সুতরাং, যদি বৈধতা পাস হয়, আমি অন্য পৃষ্ঠায় পুনর্নির্দেশ করব (নিশ্চিতকরণ)।

যদি কোনও ত্রুটি দেখা দেয় তবে ত্রুটি সহ আমার একই পৃষ্ঠাটি প্রদর্শন করা দরকার।

আমি যদি করি return View()তবে ত্রুটিটি প্রদর্শিত হয় তবে আমি যদি return RedirectToAction(উপরে হিসাবে) করি তবে এটি মডেল ত্রুটিগুলি হারাবে।

আমি বিষয়টি দেখে অবাক হই না, কেবল অবাক হয়ে বলছি আপনি ছেলেরা কীভাবে এটি পরিচালনা করছেন?

আমি অবশ্যই পুনঃনির্দেশের পরিবর্তে কেবল একই দৃশ্যটি ফিরিয়ে দিতে পারি, তবে আমার "যুক্ত করুন" পদ্ধতিতে যুক্তি রয়েছে যা ভিউ ডেটাটি জনপ্রিয় করে, যা আমাকে নকল করতে হবে।

কোনও পরামর্শ?


10
বৈধতা ত্রুটির জন্য পোস্ট-পুনঃনির্দেশ-get প্যাটার্নটি ব্যবহার না করে আমি এই সমস্যাটি সমাধান করি। আমি শুধু ভিউ () ব্যবহার করি। হুপের একগুচ্ছ ঝাঁপিয়ে পড়ার পরিবর্তে এটি করা পুরোপুরি বৈধ - এবং আপনার ব্রাউজারের ইতিহাসের সাথে মেসকে পুনঃনির্দেশ করুন।
জিমি বোগার্ড

4
এবং @ জিমিবোগার্ড যা বলেছে তা ছাড়াও, ভিউডাটাটি জনিত করে এমন Createপদ্ধতিতে যুক্তিটি বের করুন এবং এটি Createজিইটি পদ্ধতিতে এবং Createপোষ্ট পদ্ধতিতে ব্যর্থ বৈধতা শাখায় কল করুন ।
রাশ ক্যাম

4
সম্মত হন, সমস্যা এড়ানো এটি সমাধানের এক উপায়। আমার Createদৃষ্টিতে জিনিসগুলি জনসাধারণের কাছে আমার কিছু যুক্তি রয়েছে , আমি কেবল এটি কোনও পদ্ধতিতে populateStuffরেখেছি যা আমি উভয় GETএবং ব্যর্থ উভয়কেই কল করি POST
ফ্রাঙ্কোইস জোলি

12
@ জিমিগোগার্ড আমি দ্বিমত পোষণ করছি, যদি আপনি কোনও পদক্ষেপ পোস্ট করেন এবং তারপরে আপনি ইস্যুতে চালিত দৃষ্টিভঙ্গি ফিরিয়ে দেন যেখানে ব্যবহারকারী যদি সতেজ হিট করে তবে তারা সেই পোস্টটি আরম্ভ করার ইচ্ছে সম্পর্কে সতর্কতা পেয়েছে get
মাফিন ম্যান

উত্তর:


50

Reviewআপনার HttpGetক্রিয়ায় আপনার একই উদাহরণ থাকা দরকার instance এটি করার জন্য Review reviewআপনার HttpPostঅ্যাকশনটিতে অ্যাকশন অস্থায়ীভাবে আপনার ক্রিয়ায় সংরক্ষণ করা উচিত এবং তারপরে এটি HttpGetক্রিয়ায় পুনরুদ্ধার করা উচিত ।

[HttpGet]
public ActionResult Create(string uniqueUri)
{
   //Restore
   Review review = TempData["Review"] as Review;            

   // get some stuff based on uniqueuri, set in ViewData.  
   return View(review);
}
[HttpPost]
public ActionResult Create(Review review)
{
   //Save your object
   TempData["Review"] = review;

   // validate review
   if (validatedOk)
   {
      return RedirectToAction("Details", new { postId = review.PostId});
   }  
   else
   {
      ModelState.AddModelError("ReviewErrors", "some error occured");
      return RedirectToAction("Create", new { uniqueUri = Request.RequestContext.RouteData.Values["uniqueUri"]});
   }   
}

HttpGetক্রিয়াকলাপের প্রথম সম্পাদনের পরে ব্রাউজারটি সতেজ হওয়া সত্ত্বেও আপনি যদি এটি কাজ করতে চান তবে আপনি এটি করতে পারেন :

  Review review = TempData["Review"] as Review;  
  TempData["Review"] = review;

অন্যথায় রিফ্রেশ বোতাম অবজেক্ট reviewখালি হবে কারণ এতে কোনও ডেটা থাকবে না TempData["Review"]


4
দুর্দান্ত। রিফ্রেশ সমস্যার উল্লেখ করার জন্য একটি বড় +1। এটি সর্বাধিক সম্পূর্ণ উত্তর তাই আমি এটি গ্রহণ করব, ধন্যবাদ একগুচ্ছ। :)
আরপিএম 1984

8
এটি শিরোনামে প্রশ্নের উত্তর দেয় না। মডেলস্টেট সংরক্ষণ করা হয়নি এবং এতে ইনপুট এইচটিএমএল হেল্পার্স ব্যবহারকারীর প্রবেশের সংরক্ষণ না করার মতো পদক্ষেপ রয়েছে। এটি প্রায় একটি workaround।
জন Farrell

@ উইম তার উত্তরে যা বলেছিল তা আমি শেষ করেছি।
আরপিএম 1984

17
@ জফার, আমি সম্মত, এই উত্তরটি কার্যকর হয় না এবং মডেলস্টেট ধরে রাখে না। যাইহোক, আপনি যদি এটি পরিবর্তন করেন তবে এটি এর মতো কিছু করে TempData["ModelState"] = ModelState; এবং এটি পুনরুদ্ধার করে ModelState.Merge((ModelStateDictionary)TempData["ModelState"]);, তবে এটি কাজ করবে
asgeo1

4
আপনি কি পারবেন না return Create(uniqueUri)যখন পোষ্টে বৈধতা ব্যর্থ হয়? মডেলস্টেটের মানগুলি ভিউমোডেলটি ভিউতে পাস করার চেয়ে অগ্রাধিকার নেয়, তাই পোস্ট করা ডেটা এখনও থাকা উচিত।
আজবিভেন

84

আমাকে আজ এই সমস্যাটি সমাধান করতে হবে এবং এই প্রশ্নটি এসেছিল।

উত্তরগুলির কয়েকটি কার্যকর (টেম্পডাটা ব্যবহার করে), তবে সত্যিই হাতে প্রশ্নের উত্তর দেবেন না।

আমার সর্বাধিক সেরা পরামর্শটি এই ব্লগ পোস্টে ছিল:

http://www.jefclaes.be/2012/06/persisting-model-state-when-used-prg.html

মূলত, মডেলস্টেট অবজেক্টটি সংরক্ষণ এবং পুনরুদ্ধার করতে টেম্পডাটা ব্যবহার করুন। তবে আপনি যদি এটিকে গুণাবলী থেকে দূরে সরিয়ে থাকেন তবে এটি অনেক পরিষ্কার।

যেমন

public class SetTempDataModelStateAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);         
        filterContext.Controller.TempData["ModelState"] = 
           filterContext.Controller.ViewData.ModelState;
    }
}

public class RestoreModelStateFromTempDataAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);
        if (filterContext.Controller.TempData.ContainsKey("ModelState"))
        {
            filterContext.Controller.ViewData.ModelState.Merge(
                (ModelStateDictionary)filterContext.Controller.TempData["ModelState"]);
        }
    }
}

তারপরে আপনার উদাহরণ অনুসারে, আপনি মডেলস্টেটকে এভাবে সংরক্ষণ / পুনরুদ্ধার করতে পারেন:

[HttpGet]
[RestoreModelStateFromTempData]
public ActionResult Create(string uniqueUri)
{
    // get some stuff based on uniqueuri, set in ViewData.  
    return View();
}

[HttpPost]
[SetTempDataModelState]
public ActionResult Create(Review review)
{
    // validate review
    if (validatedOk)
    {
        return RedirectToAction("Details", new { postId = review.PostId});
    }  
    else
    {
        ModelState.AddModelError("ReviewErrors", "some error occured");
        return RedirectToAction("Create", new { uniqueUri = Request.RequestContext.RouteData.Values["uniqueUri"]});
    }   
}

আপনি যদি টেম্পাটাটাতে মডেলটিও পাশ করতে চান (বিগাবের পরামর্শ অনুসারে) তবে আপনি এখনও তা করতে পারেন।


ধন্যবাদ. আমরা আপনার পদ্ধতির অনুরূপ কিছু বাস্তবায়ন করেছি। gist.github.com/ferventcoder/4735084
ferventcoder

@ asgeo1 - দুর্দান্ত সমাধান, তবে আমি আংশিক দর্শনগুলি পুনরাবৃত্তি করার সাথে একত্রে এটি ব্যবহার করে একটি সমস্যার মধ্যে পড়েছিলাম, আমি এখানে প্রশ্নটি পোস্ট করেছি: স্ট্যাকওভারফ্লো
জোশ

সতর্কতা - যদি পৃষ্ঠাটি সমস্ত অনুরোধে পরিবেশন করা হয় (এবং এজেএক্সের মাধ্যমে বিচ্ছিন্ন না হয়), আপনি এই সমাধানটি ব্যবহার করার জন্য সমস্যা জিজ্ঞাসা করছেন যেহেতু পরবর্তী অনুরোধের মাধ্যমে টেম্পডাটা সংরক্ষণ করা হয়েছে । উদাহরণস্বরূপ: আপনি এক পৃষ্ঠায় অনুসন্ধানের মানদণ্ড প্রবেশ করান, তারপরে অনুসন্ধানের ফলাফলগুলিতে পিআরজি করুন, তারপরে সরাসরি অনুসন্ধান পৃষ্ঠায় ফিরে নেভিগেট করার জন্য একটি লিঙ্কে ক্লিক করুন, মূল অনুসন্ধান মানগুলি পুনরায় সজ্জিত করা হবে। অন্যান্য অদ্ভুত এবং কখনও কখনও পুনরুত্পাদন আচরণের কঠোর আচরণও পপ আপ হয়।
পিজে 7

সেশন আইডি পরিবর্তন না করেই আমি বুঝতে পেরেছি আমি এই কাজটি করতে সক্ষম হইনি। এই সাহায্য আমাকে সমাধান যে: stackoverflow.com/a/5835631/1185136
Rudey

প্রশ্ন: একাধিক ব্রাউজার-ট্যাব তৈরি (একাধিক / একযোগে) অনুরোধগুলি যখন থাকে তখন NextRequestএবং TempDataআচরণটি কী ?
ড্যান

7

"তৈরি করুন" পদ্ধতিতে যুক্তি দিয়ে একটি ব্যক্তিগত ক্রিয়াকলাপ কেন তৈরি করবেন না এবং এই পদ্ধতিটি পান এবং পোস্ট পদ্ধতি উভয় থেকে কল করে এবং কেবল দেখুন () ফিরিয়ে দিন।


4
এটি আমিও করি, কেবলমাত্র একটি ব্যক্তিগত ক্রিয়াকলাপের পরিবর্তে, আমার পোষ্ট পদ্ধতিটি জিইটি পদ্ধতিটিকে ত্রুটি (যেমন return Create(new { uniqueUri = ... });। আপনার যুক্তিটি ডিআরআই থাকে (অনেকটা কল করার মতো RedirectToAction)) হিসাবে ডাকে , তবে পুনঃনির্দেশ দ্বারা পরিচালিত সমস্যাগুলি ছাড়াই as আপনার মডেলস্টেটটি হারাচ্ছেন
ড্যানিয়েল লিউজি

4
@ ড্যানিয়েললিউজি: এটি সেভাবে করা ইউআরএল পরিবর্তন করবে না। সুতরাং আপনি "/ নিয়ন্ত্রক / তৈরি /" জাতীয় কিছু দিয়ে শেষ করুন।
স্কোরুনকা ফ্রান্টিয়েক

@ SkorunkaFrantišek এবং ঠিক এটাই কথা। প্রশ্নটিতে বলা হয়েছে যে কোনও ত্রুটি ঘটলে আমার ত্রুটি সহ একই পৃষ্ঠাটি প্রদর্শন করা দরকার। এই প্রসঙ্গে, এটি পুরোপুরি গ্রহণযোগ্য (এবং পছন্দসই IMO) যে একই পৃষ্ঠাটি প্রদর্শিত হলে URL পরিবর্তন হয় না। এছাড়াও, এই পদ্ধতির একটি সুবিধা হ'ল যদি প্রশ্নে ত্রুটিটি বৈধতা ত্রুটি না হয় তবে একটি সিস্টেম ত্রুটি (উদাহরণস্বরূপ ডিবি টাইমআউট) এটি ব্যবহারকারীকে কেবল ফর্মটি পুনরায় জমা দেওয়ার জন্য পৃষ্ঠাটি রিফ্রেশ করার অনুমতি দেয়।
ড্যানিয়েল লিউজি

4

আমি ব্যবহার করতে পারে TempData["Errors"]

টেম্পডেটা 1 বার ডেটা সংরক্ষণের ক্রিয়াগুলি অতিক্রম করে।


4

আমি আপনাকে মতামত ফিরিয়ে দেওয়ার পরামর্শ দিচ্ছি এবং ক্রিয়াটির কোনও বৈশিষ্ট্যের মাধ্যমে সদৃশ এড়াতে চাই। এখানে ডেটা দেখার জন্য পপুলেটিংয়ের একটি উদাহরণ। আপনি আপনার তৈরি পদ্ধতির যুক্তি দিয়ে অনুরূপ কিছু করতে পারেন।

public class GetStuffBasedOnUniqueUriAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var filter = new GetStuffBasedOnUniqueUriFilter();

        filter.OnActionExecuting(filterContext);
    }
}


public class GetStuffBasedOnUniqueUriFilter : IActionFilter
{
    #region IActionFilter Members

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {

    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.Controller.ViewData["somekey"] = filterContext.RouteData.Values["uniqueUri"];
    }

    #endregion
}

এখানে একটি উদাহরণ:

[HttpGet, GetStuffBasedOnUniqueUri]
public ActionResult Create()
{
    return View();
}

[HttpPost, GetStuffBasedOnUniqueUri]
public ActionResult Create(Review review)
{
    // validate review
    if (validatedOk)
    {
        return RedirectToAction("Details", new { postId = review.PostId });
    }

    ModelState.AddModelError("ReviewErrors", "some error occured");
    return View(review);
}

এটি কীভাবে খারাপ ধারণা? আমি মনে করি বৈশিষ্ট্যটি অন্য ক্রিয়াটি ব্যবহার করার প্রয়োজনটিকে এড়িয়ে চলে কারণ উভয় ক্রিয়াই ভিডিটাতে লোড করতে অ্যাট্রিবিউটটি ব্যবহার করতে পারে।
ক্রিস

4
: দয়া করে পোস্ট / পুনর্চালনা কটাক্ষপাত করা / প্যাটার্ন পান en.wikipedia.org/wiki/Post/Redirect/Get
DreamSonic

4
মডেল বৈধতা সন্তুষ্ট হওয়ার পরে এটি সাধারণত ব্যবহৃত হয়, একই পোস্টে রিফ্রেশে আরও পোস্টগুলি রোধ করতে। তবে যদি ফর্মটির কোনও সমস্যা থাকে তবে তা যেভাবেই হোক সংশোধন করে পুনরায় পোস্ট করা দরকার। এই প্রশ্নটি মডেল ত্রুটিগুলি পরিচালনা করে।
ক্রিস

ফিল্টারগুলি ক্রিয়াকলাপগুলিতে পুনঃব্যবহারযোগ্য কোডের জন্য বিশেষত ভিউডাটাতে জিনিস রাখার জন্য দরকারী। টেম্পডাটা হ'ল একটি কাজ
ক্রিস

4
@ পিপমকিন সম্ভবত এজাক্স সহ পোস্ট করার চেষ্টা করুন যাতে আপনার ভিউ সার্ভারের দিকটি পুনর্নির্মাণে আপনার কোনও অসুবিধা না হয়।
ক্রিস

2

আমার কাছে একটি পদ্ধতি রয়েছে যা টেম্পের ডেটাতে মডেল স্টেট যুক্ত করে। আমার তখন আমার বেস কন্ট্রোলারে একটি পদ্ধতি রয়েছে যা কোনও ত্রুটির জন্য অস্থায়ী ডেটা পরীক্ষা করে। যদি এটি থাকে তবে তা তাদের আবার মডেলস্টেটে যুক্ত করে।


1

আমার দৃশ্যটি কিছুটা জটিল, কারণ আমি পিআরজি প্যাটার্নটি ব্যবহার করছি তাই আমার ভিউমোডেল ("সংক্ষেপেভিএম") টেম্পডাটাতে রয়েছে এবং আমার সংক্ষিপ্তসার স্ক্রিনটি এটি প্রদর্শিত হয়। অন্য অ্যাকশনে কিছু তথ্য পোস্ট করার জন্য এই পৃষ্ঠায় একটি ছোট ফর্ম রয়েছে। জটিলতাটি এই পৃষ্ঠায় সারাংশ ভিএম এর কয়েকটি ক্ষেত্র সম্পাদনা করার প্রয়োজনীয়তা থেকে এসেছে।

সংক্ষিপ্তসার। Shtml এর বৈধতা সংক্ষিপ্তসার রয়েছে যা আমরা তৈরি করব এমন মডেলস্টেট ত্রুটিগুলি ধরবে।

@Html.ValidationSummary()

আমার ফর্মটির এখন সংক্ষিপ্তসার () এর জন্য এইচটিপি পোস্ট পোস্টে পোস্ট করা দরকার। সম্পাদিত ক্ষেত্রগুলি উপস্থাপন করার জন্য আমার কাছে আরও একটি খুব ছোট ভিউমোডেল রয়েছে এবং মডেলবাইন্ডগুলি এগুলি আমার কাছে পাবেন।

নতুন ফর্ম:

@using (Html.BeginForm("Summary", "MyController", FormMethod.Post))
{
    @Html.Hidden("TelNo") @* // Javascript to update this *@

এবং কর্ম ...

[HttpPost]
public ActionResult Summary(EditedItemsVM vm)

এখানে আমি কিছু বৈধতা করছি এবং আমি কিছু খারাপ ইনপুট সনাক্ত করি, সুতরাং ত্রুটিগুলি সহ আমার সংক্ষিপ্ত পৃষ্ঠায় ফিরে আসতে হবে। এর জন্য আমি টেম্পাটাটা ব্যবহার করি, যা পুনঃনির্দেশ থেকে বেঁচে থাকবে। যদি ডেটা নিয়ে কোনও সমস্যা না থাকে তবে আমি সংক্ষিপ্তভিএম অবজেক্টটি একটি অনুলিপি দ্বারা প্রতিস্থাপন করব (তবে সম্পাদিত ক্ষেত্রগুলি অবশ্যই পরিবর্তিত হয়েছে) তারপরে একটি রিডাইরেক্টোঅ্যাকশন ("NextAction") করুন;

// Telephone number wasn't in the right format
List<string> listOfErrors = new List<string>();
listOfErrors.Add("Telephone Number was not in the correct format. Value supplied was: " + vm.TelNo);
TempData["SummaryEditedErrors"] = listOfErrors;
return RedirectToAction("Summary");

সংক্ষিপ্তসার নিয়ন্ত্রক ক্রিয়া, যেখানে এই সমস্ত শুরু হয়, টেম্পডাটাতে কোনও ত্রুটি সন্ধান করে এবং তাদের মডেলস্টেটে যুক্ত করে।

[HttpGet]
[OutputCache(Duration = 0)]
public ActionResult Summary()
{
    // setup, including retrieval of the viewmodel from TempData...


    // And finally if we are coming back to this after a failed attempt to edit some of the fields on the page,
    // load the errors stored from TempData.
        List<string> editErrors = new List<string>();
        object errData = TempData["SummaryEditedErrors"];
        if (errData != null)
        {
            editErrors = (List<string>)errData;
            foreach(string err in editErrors)
            {
                // ValidationSummary() will see these
                ModelState.AddModelError("", err);
            }
        }

1

মাইক্রোসফ্ট টেম্পডাটাতে জটিল ডাটা ধরণের সঞ্চয় করার ক্ষমতা সরিয়ে ফেলেছে, অতএব আগের উত্তরগুলি আর কাজ করে না; আপনি কেবল স্ট্রিংয়ের মতো সাধারণ ধরণের সঞ্চয় করতে পারেন। আমি প্রত্যাশা অনুযায়ী কাজ করতে @ asgeo1 দ্বারা উত্তরটি পরিবর্তন করেছি।

public class SetTempDataModelStateAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);

        var controller = filterContext.Controller as Controller;
        var modelState = controller?.ViewData.ModelState;
        if (modelState != null)
        {
            var listError = modelState.Where(x => x.Value.Errors.Any())
                .ToDictionary(m => m.Key, m => m.Value.Errors
                .Select(s => s.ErrorMessage)
                .FirstOrDefault(s => s != null));
            controller.TempData["KEY HERE"] = JsonConvert.SerializeObject(listError);
        }
    }
}


public class RestoreModelStateFromTempDataAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        var controller = filterContext.Controller as Controller;
        var tempData = controller?.TempData?.Keys;
        if (controller != null && tempData != null)
        {
            if (tempData.Contains("KEY HERE"))
            {
                var modelStateString = controller.TempData["KEY HERE"].ToString();
                var listError = JsonConvert.DeserializeObject<Dictionary<string, string>>(modelStateString);
                var modelState = new ModelStateDictionary();
                foreach (var item in listError)
                {
                    modelState.AddModelError(item.Key, item.Value ?? "");
                }

                controller.ViewData.ModelState.Merge(modelState);
            }
        }
    }
}

এখান থেকে, আপনি প্রয়োজন হিসাবে একটি নিয়ামক পদ্ধতিতে প্রয়োজনীয় ডেটা টীকাটি সহজেই যুক্ত করতে পারেন।

[RestoreModelStateFromTempDataAttribute]
[HttpGet]
public async Task<IActionResult> MethodName()
{
}


[SetTempDataModelStateAttribute]
[HttpPost]
public async Task<IActionResult> MethodName()
{
    ModelState.AddModelError("KEY HERE", "ERROR HERE");
}

পুরোপুরি কাজ করে !. কোডটি আটকানোর সময় একটি ছোট বন্ধনী ত্রুটি ঠিক করার জন্য উত্তর সম্পাদনা করা।
ভিডিডাব্লুডাব্লুডি

0

আমি আমার ভিউমোডেলে এমন একটি পদ্ধতি যুক্ত করতে পছন্দ করি যা ডিফল্ট মানগুলিকে জনপ্রিয় করে তোলে:

public class RegisterViewModel
{
    public string FirstName { get; set; }
    public IList<Gender> Genders { get; set; }
    //Some other properties here ....
    //...
    //...

    ViewModelType PopulateDefaultViewData()
    {
        this.FirstName = "No body";
        this.Genders = new List<Gender>()
        {
            Gender.Male,
            Gender.Female
        };

        //Maybe other assinments here for other properties...
    }
}

তারপরে যখনই আমাকে এই জাতীয় মূল ডেটা দরকার তখন আমি এটি কল করি:

    [HttpGet]
    public async Task<IActionResult> Register()
    {
        var vm = new RegisterViewModel().PopulateDefaultViewValues();
        return View(vm);
    }

    [HttpPost]
    public async Task<IActionResult> Register(RegisterViewModel vm)
    {
        if (!ModelState.IsValid)
        {
            return View(vm.PopulateDefaultViewValues());
        }

        var user = await userService.RegisterAsync(
            email: vm.Email,
            password: vm.Password,
            firstName: vm.FirstName,
            lastName: vm.LastName,
            gender: vm.Gender,
            birthdate: vm.Birthdate);

        return Json("Registered successfully!");
    }

0

আমি এখানে কেবল নমুনা কোড দিচ্ছি আপনার ভিউমোডেলে আপনি "মডেলস্টেটড অভিধান" টাইপের একটি সম্পত্তি যুক্ত করতে পারেন

public ModelStateDictionary ModelStateErrors { get; set; }

এবং আপনার পোষ্ট অ্যাকশন মেন্টহোডে আপনি সরাসরি কোড লিখতে পারেন

model.ModelStateErrors = ModelState; 

এবং তারপরে নীচের মতো টেম্পাটাটাতে এই মডেলটি বরাদ্দ করুন

TempData["Model"] = model;

এবং আপনি যখন অন্য নিয়ামকের ক্রিয়া পদ্ধতিতে পুনর্নির্দেশ করেন তখন নিয়ামকতে আপনাকে টেম্পডেটা মানটি পড়তে হয়

if (TempData["Model"] != null)
{
    viewModel = TempData["Model"] as ViewModel; //Your viewmodel class Type
    if(viewModel.ModelStateErrors != null && viewModel.ModelStateErrors.Count>0)
    {
        this.ViewData.ModelState.Merge(viewModel.ModelStateErrors);
    }
}

এটাই. এর জন্য আপনাকে অ্যাকশন ফিল্টার লিখতে হবে না। আপনি যদি অন্য কোনও নিয়ামকের অন্য দর্শনে মডেল রাষ্ট্রের ত্রুটি পেতে চান তবে এটি উপরের কোডের মতোই সহজ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.