2013-06-04 20 views
6

Şu anda DropDownListFor() nesnemin yerleştirilme biçiminden memnun değilim. IEnumerable'ı olabildiğince genel bir şekilde bulmaya çalışıyorum. Şimdiye kadar sahip olduğum şey bu.ASP.NET MVC 3 <T> IEnumerable için <selectListItem>

Yardımcısı:

public static List<SelectListItem> ToSelectList(IDictionary<string,string> dictionaryItems, string selectedValue, string noSelection, bool search = false) 
    { 
     List<SelectListItem> items = new List<SelectListItem>(); 

     if (search) 
     { 
      items.Add(new SelectListItem { Selected = true, Value = "-1", Text = string.Format("-- {0} --", noSelection) }); 
     } 

     foreach (var item in dictionaryItems) 
     { 
      items.Add(new SelectListItem 
      { 
       Text = item.Key, 
       Value = item.Value, 
       Selected = selectedValue == item.Value ? true : false 
      }); 
     } 

     return items 
      .OrderBy(l => l.Text) 
      .ToList(); 
    } 

Denetleyici:

[HttpGet] 
    public ActionResult Index() 
    { 
     var model = new CreateModel(); 

     var parentOrganisations = _orgs.FindBy(o => o.OwningOrganisationID == Globals.OrganisationID || o.ID == Globals.OrganisationID) 
      .OrderBy(o => o.OrganisationName); 

     Dictionary<string, string> items = new Dictionary<string, string>(); 

     foreach (var item in parentOrganisations) 
     { 
      items.Add(item.OrganisationName, item.ID.ToString()); 
     } 

     model.Organisations = SelectLists.ToSelectList(items, "-1", "-- None -- ", true); 

     return View(model); 
    } 

Görünüm:

denetleyicisi tekrarlanan kod ÇOK gibi görünüyor
<div class="control-group"> 
     <label class="control-label">Parent Organisation</label> 
     <div class="controls"> 
      @Html.DropDownListFor(m => m.ParentOrganisationID, Model.Organisations, new { @class = "input-xlarge"}) 
      <p class="help-block">Select a parent organisation to create a branch</p> 
     </div> 
    </div> 

. Genel bir liste alır, Değer ve Metni bir Sözlük'e ekler ve sonra bunu, modelin bir parçası olarak göndermek üzere seçim listesini oluşturan bir yardımcı için girdi olarak kullanır.

Bunu başarmanın herhangi bir yolu daha var mı? Kontrolörümde şişirmekten nefret ediyorum ve bir formda birkaç düşüş olduğunda bu durum tam olarak ne olacağıyla ilgili.

sayesinde

DÜZENLEME - Kenneth'in yardımcı yöntemine sayesinde, artık birleştirdik denetleyici içinde bir çağrıda her şey:

  model.Organisations = _orgs.FindBy(o => o.OwningOrganisationID == Globals.OrganisationID || o.ID == Globals.OrganisationID) 
      .OrderBy(o => o.OrganisationName) 
      .ToList() 
      .ToSelectList(org => org.OrganisationName, org => org.ID.ToString(), "-1", "None", true); 

cevap

8

Anahtarı ve elde geri aramalar sağlayabilir Değer ve sonra bunları kullanın. Bunun dışında bir uzantı yöntemi olarak oluşturabilirsiniz:

Uzatma yöntemi:

public static List<SelectListItem> ToSelectList<T>(this List<T> Items, Func<T, string> getKey, Func<T, string> getValue, string selectedValue, string noSelection, bool search = false) 
    { 
     List<SelectListItem> items = new List<SelectListItem>(); 

     if (search) 
     { 
      items.Add(new SelectListItem { Selected = true, Value = "-1", Text = string.Format("-- {0} --", noSelection) }); 
     } 

     foreach (var item in Items) 
     { 
      items.Add(new SelectListItem 
      { 
       Text = getKey(item), 
       Value = getValue(item), 
       Selected = selectedValue == getValue(item) ? true : false 
      }); 
     } 

     return items 
      .OrderBy(l => l.Text) 
      .ToList(); 
    } 

Kullanımı:

List<Org>() parentOrganisations = // fetch here 
model.Organisations = parentOrganisations.ToSelectList(org => org.ID.ToString(), 
                 org => org.OrganisationName, 
                 "-1", 
                 "-- None -- ", 
                 true); 

Not: Ben SO-editörü bu daktilo, Bu yüzden bazı sözdizimi hataları olabilir (yine de çözmek kolay olmalıdır).

+0

teşekkür ederiz! Tam olarak ne için umuyordum. – Paul

1

yalnızca böyle denetleyicisi yapabilirsiniz: -

List<SelectListItem> dropdownItems = parentOrganisations 
    .Select(item => new SelectListItem 
    { 
     Value = item.ID.ToString(), 
     Text = item.OrganisationName, 
     Selected = "-1" == item.ID.ToString() ? true : false 
    }) 
    .ToList();