মডেলস্টেট.আইএসভিড নেরডডিনারের এএসপি.নেট এমভিসির জন্য বৈধ?


148

উপর NerdDinner উদাহরণ পেশাগত ASP.NET MVC 1.0 কপি নিচে (বিনামূল্যে NerdDinner সংস্করণের পৃষ্ঠা 89) নামে একটি নতুন ডিনার তৈরি করতে একটি পদ্ধতি আছে।

সেখানে এটি মডেলস্টেট চেক করে। সত্যের জন্য অসমর্থ। দেখে মনে হচ্ছে মডেলটি ডাটাবেসের জন্য বৈধ কিনা তা (যা এটি অবৈধ ফর্ম্যাট সহ তারিখের মতো, তবে ব্যবসায়িক বিধি নয়) হিসাবে ডেটা ধরণের রূপান্তরগুলি ধারণ করে। এটা কি সত্যি?

ফর্মটি জমা দেওয়ার সময়, যদি তারিখে আপনার কোনও ত্রুটি থাকে, মডেলস্টেট.আইএসভিডটি মিথ্যা হবে এবং আপনি একটি ত্রুটি ফিরে পাবেন তবে কেবলমাত্র তারিখের জন্য কারণ অ্যাডরুলভিউলেশনগুলি কখনও কার্যকর হয়নি। আপনি যদি মডেলস্টেটের জন্য চেকটি পুরোপুরি সরিয়ে ফেলেন sআইএসভালিড, তবে আপনি অবৈধ হওয়ার তারিখটিতে চিহ্নিতকরণ সহ সমস্ত ত্রুটি (ব্যতিক্রমের কারণে) পেয়ে যাবেন। তারপরে, মডেলস্টেটের জন্য চেক কেন? কেন সেখানে আদৌ অসামান্য? আমি কিছু অনুপস্থিত করছি?

// 
// POST: /Dinners/Create 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(Dinner dinner) {
    if (ModelState.IsValid) {
        try {
            dinner.HostedBy = "SomeUser"; 

            dinnerRepository.Add(dinner);
            dinnerRepository.Save();

            return RedirectToAction("Details", new {id = dinner.DinnerID }); 
        } catch {
            ModelState.AddRuleViolations(dinner.GetRuleViolations());
        } 
    } 
    return View(dinner); 
} 

উত্তর:


143

ModelState.IsValid কোনও মডেলের ত্রুটি যুক্ত করা হয়েছে কিনা তা আপনাকে বলে ModelState

ডিফল্ট মডেল বাইন্ডারটি বেসিক ধরণের রূপান্তর সমস্যাগুলির জন্য কিছু ত্রুটি যুক্ত করবে (উদাহরণস্বরূপ, "ইনট" এমন কোনও কিছুর জন্য একটি অ-সংখ্যা পাস করা)। আপনি যে কোনও বৈধতা সিস্টেম ব্যবহার করছেন তার উপর ভিত্তি করে আপনি মডেলস্টেটকে আরও সম্পূর্ণরূপে পপুলেট করতে পারেন।

নমুনা DataAnnotationsমডেল বাইন্ডার DataAnnotationsআপনার মডেলের বৈশিষ্ট্যগুলি থেকে নেওয়া বৈধতা ত্রুটি সহ মডেল রাজ্য পূরণ করবে ।


ব্র্যাড এটির কোনও উপায় নেই যা মডেলস্টেট ছাড়াই ডেটা অ্যানোটেশনগুলি "ইসওয়ালিড" দিয়ে সজ্জিত কোনও মডেল কিনা তা খুঁজে বের করার উপায় রয়েছে। (উদাহরণস্বরূপ বলুন যে
অবজেক্টটি

1
না, মডেলস্টেট.আইএসভালিড হল মডেল বাইন্ডিংয়ের সময় কোনও বৈধতা (বা ডেটা রূপান্তর) ত্রুটি ছিল কিনা তা জানার একমাত্র উপায়।
ব্র্যাড উইলসন

@ ব্র্যাড, আপনি যখন বলছেন "আপনি যে কোনও বৈধতা সিস্টেম ব্যবহার করছেন তার উপর ভিত্তি করে আপনি মডেলস্টেটকে আরও পুরোপুরি জনবসতিপূর্ণ করতে পারেন", কীভাবে এটি সম্পন্ন হবে? আমার ভিউমোডেলের জন্য আমার মডেলস্টেট বৈধকরণ কোডটি ক্র্যাক-ওপেন করার কোনও উপায় আছে? আমি EF4 ব্যবহার করছি, তাই আমার বৈধতাটির বেশিরভাগটি বাক্সের বাইরে স্বয়ংক্রিয় is
WEFX

13
ব্যবহার করুন: var errors = ModelState.Values.SelectMany(v => v.Errors);কোনও বৈধতা সংক্রান্ত সমস্যাগুলি দেখতে একটি ব্রেক পয়েন্ট সহ।
পূর্ণ_প্রজ_ফুট

কখনও কখনও সম্পর্কিত সারণীতে এটির ত্রুটি যদি সম্পত্তির নাম পরিবর্তন করা হয়, মাইগ্রেশন সম্পাদন করা হয়নি এবং ফলস্বরূপ SaveChanges (); ব্যর্থ হয় এবং পরিবর্তনের কারণে ঘটতে পারে না।
ওরাকুলার ম্যান

25

ত্রুটি থেকে: ModelState.AddRuleViolations(dinner.GetRuleViolations());

হতে হবে:

ModelState.AddModelErrors(dinner.GetRuleViolations());

তথ্যসূত্র: http://www.wrox.com/WileyCDA/WroxTitle/Professional-ASP-NET-MVC-1-0.productCd-0470384611,descCd-ERRATA.html


5
2015 পর্যন্ত AddModelErrorsপদ্ধতিটির অস্তিত্ব নেই।
ফিলিপ কোরিয়া

6
২০১ of সালের হিসাবে, ModelState.AddModelErrors()পদ্ধতিটি বিদ্যমান রয়েছে
জন

7
2017 হিসাবে, বহুবচন ModelState.AddModelErrorপদ্ধতি বিদ্যমান।
জাচাফার

0

হ্যাঁ, জ্যারেড এবং কেলি অর্র ঠিক বলেছেন। আমি সম্পাদনা ব্যতিক্রমের মতো নীচের কোডটি ব্যবহার করি।

foreach (var issue in dinner.GetRuleViolations())
{
    ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}

পরিবর্তে

ModelState.AddRuleViolations(dinner.GetRuleViolations());

0

সমস্ত মডেল ক্ষেত্রের যাঁর নির্দিষ্ট প্রকার রয়েছে, সেগুলি নিয়ন্ত্রকের কাছে ফিরে আসার পরে বৈধ হওয়া উচিত। যদি কোনও মডেল ক্ষেত্র তাদের সংজ্ঞায়িত প্রকারের সাথে মিলে না যায়, তবে ModelState.IsValid মিথ্যা প্রত্যাবর্তন করবে। কারণ, এই ত্রুটিগুলি মডেলস্টেটে যুক্ত করা হবে।

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