2009-07-06 14 views
24

मैं अपने पहले .NET MVC एप्लिकेशन पर काम कर रहा हूं और संदर्भ बिंदु के रूप में नेडरडिनर ट्यूटोरियल का उपयोग कर रहा हूं। एक बिंदु जो मुझे इस समय चिंतित कर रहा है वह UpdateModel() विधि है। (मैं चीजों को मैं सच में समझ में नहीं आता का उपयोग कर पसंद नहीं है।)एएसपी.नेट एमवीसी अपडेट मॉडल() विधि कैसे काम करता है?

NerdDinner tutorial से लिया -

// 
// POST: /Dinners/Edit/2 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(int id, FormCollection formValues) { 

    Dinner dinner = dinnerRepository.GetDinner(id); 

    UpdateModel(dinner); 

    dinnerRepository.Save(); 

    return RedirectToAction("Details", new { id = dinner.DinnerID }); 
} 

मेरा मुख्य सवाल यह है कि करता है UpdateModel() formValues ​​पद्धति संपादित करें में पारित करने के लिए पहुँच प्राप्त है ? संग्रह विधि के पैरामीटर के रूप में स्पष्ट रूप से क्यों पारित नहीं किया जाता है?

+0

मुझे माइक्रोसॉफ्ट से [एएसपी.नेट एमवीसी स्रोत] (http://www.microsoft.com/downloads/details.aspx?FamilyID=53289097-73ce-43bf-b6a6-35e00103cb4b&displaylang=en) प्राप्त होगा, और उपयोग करें कि आपके कोड के माध्यम से कदम। फिर आप यह देखने में सक्षम होंगे कि वे वास्तव में क्या जादू कर रहे हैं :-) – mkchandler

+0

यह केवल फ़ॉर्म संग्रह परिदृश्य या अन्य के लिए ही काम करेगा? – Krish

उत्तर

3

यह सभी HttpRequest इनपुट जैसे फॉर्म, क्वेरीस्ट्रिंग, कुकीज़ और सर्वर चर का निरीक्षण करता है। मुझे लगता है कि इस क्रम में।

+0

'अपडेटमोडल फ़ंक्शन' केवल फ़ॉर्म संग्रह परिदृश्य के लिए ही काम करेगा या अन्य भी? – Krish

24

UpdateModel() एक नियंत्रक सहायक विधि है जो विभिन्न इनपुट डेटा स्रोतों (एक दृश्य, क्वेरी स्ट्रिंग मान, सत्र चर/कुकीज़ इत्यादि से आने वाले HTTP POST डेटा) को स्पष्ट मॉडल ऑब्जेक्ट में इंगित करने का प्रयास करता है जो आप इंगित करते हैं एक पैरामीटर के रूप में। अनिवार्य रूप से, यह केवल मॉडल बाध्यकारी के लिए है।

आप एक जोरदार टाइप मॉडल (एक दृश्य मॉडल की तरह) के रूप में अपने कार्य के लिए इनपुट पैरामीटर व्यक्त करते हैं, तो आप पहले से ही चरण हैं, जो पर्दे के पीछे किया जाता है जब UpdateModel() कहा जाता है के सभी लिया है। यदि आप DataContext से किसी ऑब्जेक्ट को पुनर्प्राप्त करते हैं और इसकी प्रॉपर्टीज को संपादित करते हैं, तो SaveChanges() आपको डेटाबेस को अद्यतनों को वापस धक्का देने की आवश्यकता है (इस मामले में, सहेजें())।

उदाहरण:

// 
// POST: /Dinners/Edit/2 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(DinnerViewModel incoming) { 

    var dinner = dinnerRepository.GetDinner(incoming.DinnerID); 
    dinner.Description = incoming.Description; 
    dinnerRepository.Save(); 

    return RedirectToAction("Details", new { id = incoming.DinnerID }); 
} 

हालांकि, वहाँ एक जोरदार टाइप मॉडल के साथ UpdateModel() का उपयोग कर के लिए एक यूज़-केस है: जब आप करने के लिए एक जोरदार टाइप मॉडल में गुजर और चाहते हैं अपने मूल्यों डेटाबेस से किसी इकाई के सीधे उन्हें प्रतिस्थापित करें (बशर्ते वे सभी नामित हों और इसे टाइप करें)। इस मामले में, आप ऑब्जेक्ट को पुनर्प्राप्त करेंगे, उस पर UpdateModel() का उपयोग करें, और इसके मॉडल बाध्यकारी ऑपरेशन किसी भी समान नामित और टाइप की गई संपत्तियों को दृढ़ता से टाइप की गई वस्तु से पुनर्प्राप्त ऑब्जेक्ट में खींच देगा। दूसरे शब्दों में, यह आपके लिए प्रतिबिंब प्रदर्शन करेगा।

तो, उदाहरण के लिए, यदि आप सभी गुणों को अद्यतन करने के लिए अपडेट किए बिना अपडेट करना चाहते हैं, और आपके दृढ़ता से टाइप किए गए मॉडल और डेटाबेस मॉडल के समान नाम वाले गुण हैं, तो भी आप लाभ लेने के लिए UpdateModel() का उपयोग करना चाहेंगे प्रतिबिंब का।

उदाहरण:

// 
// POST: /Dinners/Edit/2 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(DinnerViewModel incoming) { 

    var dinner = dinnerRepository.GetDinner(incoming.DinnerID); 
    UpdateModel(dinner); 
    dinnerRepository.Save(); 

    return RedirectToAction("Details", new { id = incoming.DinnerID }); 
} 

केवल लाभ यहाँ (एक FormCollection वस्तु का उपयोग करने पर) है कि आप दृढ़ता से टाइप वस्तु के अन्य सभी गुण के लिए उपयोग किया था (के रूप में incoming.DinnerID द्वारा दिखाया गया है) है।

निष्कर्ष: यदि आप किसी व्युत्पन्न वस्तु पर दृढ़ता से टाइप की गई वस्तु का अनुवाद कर रहे हैं, तो संभवतः UpdateModel() का उपयोग करना सबसे आसान है। हालांकि, यदि आप व्युत्पन्न वस्तु के कुछ गुणों को बस अपडेट कर रहे हैं तो यह काफी हद तक अनावश्यक है। साथ ही, इस बात से अवगत रहें कि एंटीटी फ्रेमवर्क (लिंक से एसक्यूएल जैसे कुछ की बजाय) इस मूत को बनाता है, क्योंकि यह दृढ़ता से टाइप की गई वस्तुओं और व्युत्पन्न वस्तुओं को अपने तरीके से जोड़ सकता है।

+0

'अपडेटमोडल फ़ंक्शन' केवल फ़ॉर्म संग्रह परिदृश्य या अन्य के लिए ही काम करेगा? – Krish

संबंधित मुद्दे