2011-07-08 18 views
6

मुझे अपने व्यूमोडेल से जुड़ने के लिए एक चुनिंदा सूची नहीं मिल सकती है।व्यूमोडेल के साथ एक चयन सूची कैसे बांधें?

<div class="editor-label"> 
     @Html.LabelFor(model => model.Question.type_code, "Question_Type") 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownListFor(model => Model.Question.Question_Type, (SelectList)ViewBag.type_code) 
     @Html.ValidationMessageFor(model => model.Question.type_code) 
    </div> 
:

public ActionResult Edit(int id) 
    { 
     Question question = db.Question.Single(q => q.question_id == id); 
     QuestionViewModel qvm = new QuestionViewModel(question); 
     ViewBag.category_id = new SelectList(db.Category, "category_id", "category_name", qvm.Question.category_id); 
     ViewBag.type_code = new SelectList(db.Question_Type, "type_code", "type_description", qvm.Question.type_code); 
     return View(qvm); 
    } 

और मेरे विचार में कोड इस तरह दिखता है:

मैं एक ViewModel जो एक प्रश्न इकाई और एक स्ट्रिंग

public class QuestionViewModel 
{ 
    public Question Question { get; set; } 
    public string RefUrl { get; set; } 

    public QuestionViewModel() 
    { 
    } 

    public QuestionViewModel(Question question, string RefUrl) 
    { 
     this.Question = question; 
     this.RefUrl = RefUrl; 
    } 

    public QuestionViewModel(Question question) 
    { 
     this.Question = question; 
     this.RefUrl = ""; 
    } 
} 

इस नियंत्रक होता है

व्यू प्रश्न इकाई की Question_Type को चयनित मान पर सेट करता है, लेकिन जब मैं फॉर्म जमा करता हूं, वें ई प्रमाणीकरण संदेश ट्रिगर करने के लिए ??

+0

Model.Question.Question_Type Model.Question.type_code 2 अलग-अलग गुण हैं? आपके पास Question.type_code के लिए एक सत्यापन संदेश है, लेकिन आप Question_Type सेट कर रहे हैं? –

उत्तर

14

आपके पास कोई दृश्य मॉडल नहीं है। यह एक संकर वर्ग है जिसे आपने मॉडल देखा है और जिसमें आपने अपनी डोमेन इकाई (Question) लपेट ली है। यह बुरा है, ऐसा मत करो।

यहां मैं आपको सलाह दूंगा।

public class QuestionViewModel 
{ 
    [DisplayName("Question_Type")] 
    public string SelectedQuestionType { get; set; } 

    public IEnumerable<SelectListItem> QuestionTypes { get; set; } 

    // didn't see where you are using this on your view 
    public string RefUrl { get; set; } 
} 

तो है: जो आपके विचार की आवश्यकताओं को प्रतिबिंबित करेगा (अपने वर्तमान वर्णन से यह इस DDL से कुछ सवाल प्रकार का चयन करने के लिए कुछ प्रश्न प्रकार उपयोगकर्ता युक्त और अनुमति देता है एक dropdownlist है) एक असली दृश्य मॉडल के डिजाइन द्वारा शुरू आपके डोमेन मॉडल और आपके व्यू मॉडल के बीच आपका नियंत्रक मानचित्र।

public ActionResult Edit(int id) 
{ 
    var question = db.Question.Single(q => q.question_id == id); 
    var qvm = new QuestionViewModel 
    { 
     // preselect a value 
     SelectedQuestionType = question.type_code, 
     QuestionTypes = db.Question_Type.Select(x => new SelectListItem 
     { 
      Value = x.type_code, 
      Text = x.type_description 
     }) 
    }; 
    return View(qvm); 
} 

और उसके बाद:

<div class="editor-label"> 
    @Html.LabelFor(x => x.SelectedQuestionType) 
</div> 
<div class="editor-field"> 
    @Html.DropDownListFor(
     x => SelectedQuestionType, 
     new SelectList(Model.QuestionTypes, "Value", "Text") 
    ) 
    @Html.ValidationMessageFor(x => x.SelectedQuestionType) 
</div> 

और एक अंतिम टिप्पणी: बेशक एक आगे सुधार AutoMapper उपयोग करने के लिए सभी अपने नियंत्रक कार्यों पर इस मानचित्रण से बचने के लिए किया जाएगा सुनिश्चित करें कि आप किसी भी कमाई से छुटकारा पा लिया है ViewBag/ViewData कुरूपता और दृश्य दृश्य में आपकी दृश्य को कुछ भी देखने की ज़रूरत है। आपने अपनी कंट्रोलर एक्शन में कुछ श्रेणियों को दिखाया है जो आपके द्वारा दिखाए गए दृश्य स्निपेट में भौतिक नहीं थे। यदि आपको कभी उनकी आवश्यकता होती है तो उन्हें अपने दृश्य मॉडल में रखें, वैसे ही हमने प्रश्न प्रकारों के साथ किया।

+0

लेकिन मुझे प्रश्न इकाई को दृश्य में भेजने की आवश्यकता है ताकि मैं इसे संपादित कर सकूं? इस तरह आप केवल QuestionViewModel भेजते हैं जिसमें Question_Type और ref_URL – Nanek

+1

@Nanek शामिल हैं, आपको अपने विचार में कोई प्रश्न इकाई भेजने की आवश्यकता नहीं है। जैसा कि मैंने कहा, आपके विचार में संपादित करने के लिए आवश्यक सभी गुण आपके दृश्य मॉडल का हिस्सा होना चाहिए। फिर आपकी पोस्ट एक्शन इस समान दृश्य मॉडल को ले जाएगी और इसे वापस डोमेन पर मैप करें प्रश्न मॉडल जो संपादन के लिए भंडार में भेजा जाएगा या जो कुछ भी आवश्यक है। –

+0

@ डारिन, पोस्टटाइप पोस्ट पर शून्य क्यों है? पोस्ट विधि कैसा दिखता है? – mcass20

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