2011-01-02 13 views
22

मैं एक एमवीसी 3 वेब अनुप्रयोग पर काम कर रहा हूं। मैं whe अनुप्रयोग प्रबंधन प्रणाली से ब्लो संपादित करते समय दिखाए गए श्रेणियों की एक सूची चाहता हूं। मेरे व्यूमोडेल में मुझे निम्नलिखित संपत्तियों को श्रेणियों के लिए selectlistitems की सूची के लिए परिभाषित किया गया है।सी # एमवीसी 3 चयनित मूल्य के साथ चयन सूची का चयन कर

/// <summary> 
/// The List of categories 
/// </summary> 
[Display(Name = "Categorie")] 
public IEnumerable<SelectListItem> Categories { get; set; } 

अगला चरण, मेरे नियंत्रक में निम्न संपादन कार्रवाई होती है जहां selectlistitems की सूची डेटाबेस से भर जाती है।

public ActionResult Edit(Guid id) 
{ 
    var blogToEdit = _blogService.First(x => x.Id.Equals(id)); 
    var listOfCategories = _categorieService.GetAll(); 
    var selectList = listOfCategories.Select(x =>new SelectListItem{Text = x.Name, Value = x.Id.ToString(), Selected = x.Id.Equals(blogToEdit.Category.Id)}).ToList(); 
    selectList.Insert(0, new SelectListItem{Text = Messages.SelectAnItem, Value = Messages.SelectAnItem}); 

    var viewModel = new BlogModel 
         { 
          BlogId = blogToEdit.Id, 
          Active = blogToEdit.Actief, 
          Content = blogToEdit.Text, 
          Title = blogToEdit.Titel, 
          Categories = selectList //at this point i see the expected item being selected 
          //Categories = new IEnumerable<SelectListItem>(listOfCategories, "Id", "Naam", blogToEdit.CategorieId) 
         }; 
    return View(viewModel); 
} 

जब मैं दृश्य वापस आने से ठीक पहले ब्रेकपॉइंट सेट करता हूं, तो मुझे लगता है कि चयन सूची भरने के बाद मुझे लगता है। तो इस बिंदु पर सबकुछ ठीक लगता है। व्यूमोडेल पूरी तरह से सही है। फिर मेरे विचार में (मैं रेजर का उपयोग कर रहा हूं) मुझे निम्नलिखित दो नियम मिल गए हैं जो मेरे लिए चयनसूची प्रस्तुत करना चाहते हैं।

@Html.LabelFor(m => m.Categories) @Html.DropDownListFor(model=>model.Categories, Model.Categories, Model.CategoryId) 
@Html.ValidationMessageFor(m => m.Categories) 

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

उत्तर

50
@Html.DropDownListFor(model=>model.Categories, Model.Categories, Model.CategoryId) 

यहां आप सहायक विधि का सही ढंग से उपयोग नहीं कर रहे हैं। पहला तर्क आपके दृश्य मॉडल पर एक संपत्ति होना चाहिए जिसमें वर्तमान में चयनित मूल्य शामिल होगा। यह एक स्केलर संपत्ति होनी चाहिए, संग्रह नहीं।

[Display(Name = "Categorie")] 
public IEnumerable<SelectListItem> Categories { get; set; } 
public string SelectedValue { get; set; } 

और अपने नियंत्रक कार्रवाई:

var selectList = listOfCategories.Select(x => new SelectListItem { 
    Text = x.Name, 
    Value = x.Id.ToString() 
}).ToList(); 

var viewModel = new BlogModel 
{ 
    BlogId = blogToEdit.Id, 
    Active = blogToEdit.Actief, 
    Content = blogToEdit.Text, 
    Title = blogToEdit.Titel, 
    Categories = selectList, 
    // this is what sets the selected value 
    SelectedValue = blogToEdit.Category.Id 
}; 

और बस अपने ध्यान में रखते हुए:

@Html.DropDownListFor(x => x.SelectedValue, Model.Categories) 
+0

बहुत यकीन है कि आप सही हैं, हालांकि, संपत्ति को श्रेणी आईडी नाम दिया जाना चाहिए, चयनित नहीं है (मुझे पता है, एक नाइटपिक का थोड़ा सा, +1 वैसे भी :)) –

+0

त्वरित और बहुत स्पष्ट उत्तर के लिए धन्यवाद! यह बहुत अच्छा काम किया! – Rob

+0

@ क्रिस शाफर, हां, मैं मानता हूं कि 'चयनित वैल्यू' के बजाय 'श्रेणी आईडी' नामक बेहतर होगा क्योंकि यह इसके उद्देश्य को बेहतर ढंग से प्रतिबिंबित करता है। –

1

मैं

तो आपके विचार मॉडल में आप इस तरह की संपत्ति जोड़ने की जरूरत मुझे यकीन है कि मैंने पहले एक अच्छा सूची आइटम की चयनित = सही संपत्ति का अच्छा प्रभाव डाला है। एक समस्या जो मैंने देखा था ViewData में एक विवादित मूल्य था।

+0

जब तक मैं भी नहीं, लेकिन यह एमवीसी 2 के साथ था। यह समाधान काम करता है, इसलिए मैं खुश हूं – Rob

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