मेरे पास एक बड़ा मॉडल है (बड़ा मेरा मतलब है कि मॉडल वर्ग में बहुत से फ़ील्ड/गुण हैं और प्रत्येक में कम से कम एक सत्यापन विशेषता है (जैसे Required
, MaxLength
, MinLength
आदि))। डेटा के साथ मॉडल भरने के लिए उपयोगकर्ता के लिए बहुत सारे इनपुट के साथ एक दृश्य बनाने के बजाय मैं कई विचार बनाना चाहता हूं जहां उपयोगकर्ता मॉडल फ़ील्ड का हिस्सा भर देगा और अगले चरण पर जाएंगे (किसी प्रकार का "विज़ार्ड")। चरणों के बीच पुनर्निर्देशन करते समय मैं Session
में पूर्ण वस्तु मॉडल ऑब्जेक्ट नहीं स्टोर करता हूं। कुछ नीचे की तरह:एएसपी .NET एमवीसी में मॉडल के केवल एक हिस्से को कैसे सत्यापित करें?
मॉडल:
public class ModelClass
{
[MaxLength(100)] ...
public string Prop1{get;set;}
[MaxLength(100)] ...
public string Prop2{get;set;}
...
[Required][MaxLength(100)] ...
public string Prop20{get;set;}
}
नियंत्रक:
[HttpPost]
public ActionResult Step1(ModelClass postedModel)
{
// user posts only for example Prop1 and Prop2
// so while submit I have completly emty model object
// but with filled Prop1 and Prop2
// I pass those two values to Session["model"]
var originalModel = Session["model"] as ModelClass ?? new ModelClass();
originalModel.Prop1 = postedModel.Prop1;
originalModel.Prop2 = postedModel.Prop2;
Session["model"] = originalModel;
// and return next step view
return View("Step2");
}
[HttpPost]
public ActionResult Step2(ModelClass postedModel)
{
// Analogically the same
// I have posted only Prop3 and Prop4
var originalModel = Session["model"] as ModelClass;
if (originalModel!=null)
{
originalModel.Prop3 = postedModel.Prop3;
originalModel.Prop4 = postedModel.Prop4;
Session["model"] = originalModel;
// return next step view
return View("Step3");
}
return View("SomeErrorViewIfSessionBrokesSomeHow")
}
Step1
दृश्य केवल Prop1
और Prop2
के लिए आदानों है, चरण 2 दृश्य शामिल Prop3
और Prop4
आदि
के लिए आदानों लेकिन यहां बात है
जब उपयोगकर्ता चालू है, उदाहरण के लिए, चरण 1, और 100 से अधिक अक्षरों की लंबाई के साथ Prop1 भरता है तो क्लाइंट साइड सत्यापन ठीक काम करता है। लेकिन, ज़ाहिर है, मुझे इस मान को और सर्वर पक्ष पर नियंत्रक में मान्य करना होगा। अगर मेरे पास पूरा मॉडल था तो मैं बस निम्नलिखित करता हूं:
if(!ModelState.IsValid) return View("the same view with the same model object");
इसलिए उपयोगकर्ता को फ़ॉर्म को फिर से भरना और सही करना है। लेकिन चरण 1 उपयोगकर्ता पर ने 20 के केवल 2 गुण भर दिए हैं, और मुझे उन्हें सत्यापित करने की आवश्यकता है। मैं ModelState.IsValid
का उपयोग नहीं कर सकता क्योंकि मॉडल स्थिति अमान्य होगी। जैसा कि आप देख सकते हैं Prop20
[Required]
विशेषता के साथ चिह्नित है, जब उपयोगकर्ता Prop1
और Prop2
, Prop20
सबमिट करता है और इसलिए ModelState
अमान्य है। निस्संदेह मैं उपयोगकर्ता को चरण 2 पर जाने की अनुमति दे सकता हूं, सभी चरणों को भर सकता हूं और केवल अंतिम चरण पर मॉडल स्थिति को मान्य कर सकता हूं, लेकिन यदि मैं चरण 1 गलत भरता हूं तो मैं उपयोगकर्ता को चरण 2 पर जाने की अनुमति नहीं देना चाहता। और मैं नियंत्रक में यह सत्यापन चाहता हूँ। तो सवाल यह है: मैं मॉडल के केवल एक हिस्से को कैसे सत्यापित कर सकता हूं? मैं कैसे सत्यापित कर सकता हूं कि केवल कुछ मॉडल गुण उनके सत्यापन गुणों से मेल खाते हैं?
आप प्रत्येक चरण के लिए एक अलग दृश्य मॉडल बना सकते हैं जो एक अलग दृश्य हो सकता है। ProductStep1ViewModel और ProductStep1View की तरह, लेकिन मैं उन्हें उससे बेहतर नाम दूंगा। –
@ निकब्रे, मॉडल क्लास मूल मॉडल से मैप किए गए मॉडल क्लास को देखता है, इसलिए यदि मैं मॉडलक्लास को अन्य विशेष चरण वर्गों की संरचना के रूप में बना देता हूं तो मुझे उन मॉडल वर्गों को मैप करने के लिए मैपर के लिए लगभग 40 मैपिंग नियम जोड़ना होगा, और यह एक गुच्छा होगा कोड का मैंने पहले ही इसके बारे में सोचा है, लेकिन सलाह के लिए धन्यवाद। – Dmytro
@DmytroTsiniavsky आप मैपिंग नियमों को स्पष्ट रूप से सेट अप करने से बचने के लिए [वैल्यू इंजेक्टर] (http://valueinjecter.codeplex.com/) जैसे कुछ उपयोग कर सकते हैं। – Mun