32

मैं पूरी तरह खो और कैसे 2.0 R2ASP.NET MVC 2 - ViewModel

ASP.NET MVC पर नई दृढ़ता से टाइप किया Html.DropDownListFor सहायक उपयोग करने के लिए मैं दृश्य में पर उलझन में हो रही है साथ Html.DropDownListFor भ्रम 'm writting:

<%= Html.DropDownListFor(m => m.ParentCategory, new SelectList(Model.Categories, "CategoryId", "Name", Model.ParentCategory), "[ None ]")%> 

<%= Html.ValidationMessageFor(m => m.ParentCategory)%> 

और मेरे मॉडल वस्तु इस प्रकार है:

public class CategoryForm : FormModelBase 
{ 
    public CategoryForm() 
    { 
     Categories = new List<Category>(); 

     Categories.Add(new CategoryForm.Category() { 
          CategoryId = 1, 
          Name = "CPUs" }); 
     Categories.Add(new CategoryForm.Category() { 
          CategoryId = 2, 
          Name = "Memory" }); 
     Categories.Add(new CategoryForm.Category() { 
          CategoryId = 3, 
          Name = "Hard drives" }); 
    } 

    // ...other props, snip... // 

    public Category ParentCategory { get; set; } 

    public IList<Category> Categories { get; protected set; } 

    public class Category 
    { 
     public int? CategoryId { get; set; } 
     public string Name { get; set; } 
    } 
} 

समस्या जब मैं ड्रॉपडाउन सूची से किसी आइटम का चयन, का कहना है कि पहले आइटम, मैं निम्नलिखित Valida मिलता है tionMessage त्रुटि के लिए "मान '1' अमान्य है।"

तो मैं थोड़े को देखें बदलने ...

<%= Html.DropDownListFor(m => m.ParentCategory.**CategoryId**, 
           new SelectList .../ snip ) %> 

अब यह काम करता है। मेरे व्यूमोडेल में ParentCategory प्रॉपर्टी सही 'श्रेणी आईडी' के साथ सेट है लेकिन 'नाम' शून्य है। क्या मैं दृढ़ता से टाइप की गई 'श्रेणी' ऑब्जेक्ट की बजाय ParentCategory प्रॉपर्टी के लिए केवल एक बेकार int है?

+0

यह एक है प्राप्त किया:

दृश्य तो इन दोनों होगा उपयोगकर्ता DropDownListFor के लिए अच्छा तरीका - http://stackoverflow.com/questions/3386998/dropdownlistfor-display-a-simple-list-of-strings – bcahill

उत्तर

29

मुझे भी एक ही समस्या का सामना करना पड़ रहा था।

जब मैं कार्रवाई डिबग और ModelState.Values ​​को देखने [1] .Errors [0] .Exception उदाहरण के लिए, मैं निम्न देखें:

{ "पैरामीटर रूपांतरण प्रकार 'System.String' से 'System.Collections.Generic.KeyValuePair`2 टाइप करने के लिए [[System.String, mscorlib, संस्करण = 2.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = b77a5c561934e089], [System.Int64, mscorlib, संस्करण = 2.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = b77a5c561934e089]] 'विफल रहा क्योंकि इन प्रकारों के बीच कोई प्रकार कनवर्टर परिवर्तित नहीं हो सकता है। "} सिस्टम। अपवाद {System.InvalidOperationException}

मेरे परिदृश्य में, मेरी चयनसूची एक शब्दकोश से बनाई गई है और मैं इसे अपने देखें:

<%=Html.DropDownListFor(x => x.MyDictionary, 
          new SelectList(
           Model.MyDictionary, 
           "Value", 
           "Key")) %> 

जब मैं यह करने के लिए बदल दिया है:

<%=Html.DropDownListFor(x => x.MyDictionary.Keys, // <-- changed to .Keys 
          new SelectList(
           Model.MyDictionary, 
           "Value", 
           "Key")) %> 

यह मुद्दों के बिना काम किया।

धन्यवाद।

9
<%= Html.DropDownListFor(m => m.ParentCategory, 
           new SelectList(
            Model.Categories, 
            "CategoryId", 
            "Name", 
            Model.ParentCategory), 
          "[ None ]")%> 

आप SelectList में एक आखिरी पैरामीटर के रूप में Model.ParentCategory.CategoryId का उपयोग करें और [None] पैरामीटर को दूर करने की कोशिश की?

+0

श्रेणी आईडी के साथ "[कोई नहीं]" को प्रतिस्थापित नहीं करेगा केवल डिफ़ॉल्ट/प्रारंभिक ड्रॉप डाउन सूची का मूल्य और दृश्य में मूल्य नहीं पोस्टबैक पर मॉडल? पहले एक डाउनवोट था, लेकिन मुझे यह समझने के बाद अनिश्चितता के एक फिट में वापस ले गया कि शायद एक अलग अधिभार है। क्या आप थोड़ा सा स्पष्टीकरण दे सकते हैं? –

8

मैं

public Category ParentCategory { get; set; } 

से छुटकारा और बजाय एक

public int? CategoryId { get; set; } 

बनाने जायेगा। आपको शायद आईडी को वैसे भी चाहिए - आप हमेशा आईडी के रूप में आईडी का उपयोग करके वास्तविक वस्तु को देख सकते हैं (आपके मामले में आपकी सूची में एक linq/lambda का उपयोग करके)।

<%= Html.DropDownListFor(m => m.CategoryId, 
           new SelectList(
            Model.Categories, 
            "CategoryId", 
            "Name", 
            Model.CategoryId), 
           "[ None ]")%> 

<%= Html.ValidationMessageFor(m => m.CategoryId)%> 
1

तो selectList रिक्त है ViewModel में मैं भी उपरोक्त त्रुटि

सुनिश्चित करें कि selectList सेट कर दिया जाता