6

मैं एमवीसी के लिए नया हूं, इसलिए शायद यह एक बेवकूफ सवाल है - मैं अपने सिर को एएसपी में दृढ़ता से टाइप किए गए विचारों के आसपास लाने की कोशिश कर रहा हूं। नेट एमवीसी। मैं संस्करण 3 पर काम कर रहा हूं। यदि मेरे पास 2 मॉडल के साथ एक परियोजना है - व्यक्ति और विभाग कहें। एक व्यक्ति को एक विभाग से संबंधित होना चाहिए। तो मैं अपने विभाग मॉडल है (और मैं अपने नियंत्रक और CRUD इंटरफ़ेस बना लेने के बाद):एएसपी.नेट एमवीसी 3, ड्रॉपडाउनलिस्ट दृढ़ता से टाइप किए गए दृश्य में भी व्यूबैग पर निर्भर करता है

public class Person 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public int Department_Id { get; set; } 
    [ForeignKey("Department_Id") 
    public virtual Department Department { get; set;} 
} 

अब मैं अपने नियंत्रक और दृश्य उत्पन्न:

public class Department 
{ 
    public int Id { get; set;} 
    public string DeparmentName { get; set;} 
} 

तो मैं एक व्यक्ति मॉडल का संदर्भ जो विभाग है । अब, जब मैं PersonController गौर, मैं निम्नलिखित है बनाएँ:

public ActionResult Create() 
{ 
    ViewBag.Department_Id = new SelectList(db.Deparments, "Id", "DepartmentName"); 
    return View(); 
} 

और व्यक्ति \ Create.cshtml में, विभाग ड्रॉप डाउन बनाने के लिए कोड

@Html.DropDownList("Department_Id", String.Empty) 

है मैं के रूप में इसे समझें, ड्रॉपडाउनलिस्ट एचटीएमएल हेल्पर मेरी ड्रॉप डाउन सूची बनाने के लिए व्यूबैग का उपयोग कर रहा है। हालांकि, फर्स्टनाम और लास्टनाम में व्यूबैग पर भरोसा किए बिना उनके इनपुट फ़ील्ड बनाए गए प्रतीत होते हैं - इसलिए मेरे दृश्य में, मैं अपने पहले नाम और अंतिम नाम फ़ील्ड पर समय-समय पर जांच कर सकता हूं क्योंकि मेरा विचार दृढ़ता से टाइप किया गया है, लेकिन मेरे ड्रॉपडाउनलिस्ट पर नहीं।

क्या कोई कारण है कि विभाग के लिए DropDownList दृढ़ता से टाइप नहीं किया गया है या क्या मैं कुछ गलत कर रहा हूं और इसे दृढ़ता से टाइप करने का एक तरीका है?

धन्यवाद :)

उत्तर

5

कारण आपको एक व्यूबैग की आवश्यकता है क्योंकि आपका व्यक्ति उदाहरण, जिस पर आपका विचार बांधता है, उसके पास सभी संभावित विभागों के लिए डेटा नहीं है, केवल एक विभाग है। क्या इस पंक्ति में होता है:

ViewBag.Department_Id = new SelectList(db.Deparments, "Id", "DepartmentName"); 

है कि डीबी से सभी विभागों (अपने ड्रॉपडाउन बाध्य करने के लिए) मूल्य के रूप में DepartmentName ASN कुंजी के रूप में चयन सूची में जुड़ जाते हैं आईडी के साथ। आपके विचार व्यक्ति के लिए बाध्य होने के बाद, ड्रॉपडाउन उपयुक्त विभाग दिखाएगा।

+0

हाय एडविन - धन्यवाद - उस तरह की समझ में आता है - एक व्यक्ति के पास एक विभाग_आईडी है, लेकिन मैंने सोचा कि दृश्य मेरे व्यक्तिगत मॉडल के लिए बाध्यकारी था जो विभागों के संबंधों को विभाग के माध्यम से परिभाषित करता है "आभासी" संपत्ति? शायद मैं सिर्फ एमवीसी ढांचे में बहुत अधिक "जादू" की तलाश में हूं। – Rick

+0

@ रिक: मुझे लगता है कि आप करते हैं। दृश्य केवल आपके व्यक्ति द्वारा परिभाषित एक विभाग से जुड़ा हुआ है।आप विभागों की पूरी सूची को स्थानांतरित करने के लिए व्यूबैग का उपयोग करते हैं। वैसे, व्यूबाग केवल व्यूडेटा (दूसरे उत्तर से) के चारों ओर एक रैपर है जो आपको गतिशील गुण बनाने की अनुमति देता है। –

2

आप दृढ़ता से टाइप किया विचारों का उपयोग कर रहे हैं, तो आप एक जोरदार टाइप किया मॉडल है कि आप को देखने के लिए पारित पड़नी चाहिए: फिर

public class ViewData { 
    public IList<Departments> Departments {get; set;} 
} 

में आप आप नियंत्रक है:

public ActionResult Create() 
{ 
    ViewData model = new ViewData(); 
    model.Departments = db.Deparments; 
    return View(model); 
} 

अंतिम चरण चयन सूची बनाना और दृश्य पर ड्रॉप करना है:

@model ViewData 
@SelectList list = new SelectList(Model.Deparments, "Id", "DepartmentName"); 
@Html.DropDownList("Department_Id", list); 

आशा है कि यह समझ में आता है।

+0

हाय स्टीव - धन्यवाद - व्यूडेटा क्लास है जिसे आपने "व्यूमोडेल" बनाया है? – Rick

+0

हां, मैं आमतौर पर समाधान में मॉडल फ़ोल्डर में सभी दृश्य मॉडल डालता हूं। आम तौर पर मैं उन्हें {viewName} ViewData.cs – Steve

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