2010-07-28 23 views
5

Bunu bir ASP.NET MVC görünümünde bir açılır liste doldurmak için var.ASP.NET MVC: DropDownListFor herhangi bir seçenek seçmiyor

<%= Html.DropDownListFor(model => model.Bikes, 
     Model.Bikes.Select(
     x => new SelectListItem { 
       Text = x.Name, 
       Value = Url.Action("Details", "Bike", new { bikeId = x.ID }), 
       Selected = x.ID == Model.ID, 
      })) %> 

ben olması gerektiği zaman Selected özelliği true ayarlanmış olduğunu görmek için bu olabilir ayıklama. Ancak görünüm oluşturulduğunda, listedeki seçeneklerden hiçbiri seçilmez. Bunun DropDownListFor başka bir aşırı yükleme ile yapılabileceğini biliyorum, ancak bu sürümü gerçekten çalışmak istiyorum.

Herhangi bir fikrin var mı?

cevap

5

Seçtiğiniz değerin çalışmadığı nedeni, Urls'yi seçenek değerleri olarak kullanıyor olmanız, ancak Selected maddesinde Model.ID belirtilmesidir.

böyle deneyin: "Name" seçenek etiket olarak kullanılacak özellik gösterir iken

<%= Html.DropDownListFor(
    model => model.Bikes, 
    new SelectList(Model.Bikes, "Id", "Name", Model.ID) 
)%> 

"Id" seçenek değeri olarak kullanılacaktır özelliğini gösterir.

Eğer korumak istiyorsanız Url.Action deneyebilirsin: Bunu seçenek değeri olarak modeli kimliği kullanmak daha mantıklı görünüyordu ben Adı ve kimliği ters ettik göreceksiniz

<%= Html.DropDownListFor(
    model => model.Bikes, 
    new SelectList(Model.Bikes.Select(x => new { 
     Id = x.Id, 
     Name = Url.Action("Details", "Bike", new { bikeId = x.ID }) 
    }), "Id", "Name", Model.ID) 
)%> 

.


GÜNCELLEME:

bir IEnumerable (DropDownListFor yardımcı birinci argüman) bağlanarak, çünkü bu işe yaramazsa nedenidir. Aynı model.Bikes koleksiyonunu kullanırken bir skaler özelliği olmalıdır: seçenek değerleri gerçek haliyle Url'leri kullanmayan hakkında

<%= Html.DropDownListFor(
    model => model.SelectedBikeValue, 
    Model.Bikes.Select(
     x => new SelectListItem { 
       Text = x.Name, 
       Value = Url.Action("Details", "Bike", new { bikeId = x.ID }), 
       Selected = x.ID == Model.ID, 
     } 
)) %> 

My sözler.

+0

Özgün sorumumda değerlerin URL olduğunu unutmayın. –

+1

Evet, bunu farkettim ama bu bana kötü bir fikir gibi geldiğinde onları tersine çevirdim. Bu arada, seçtiğiniz değerin çalışmadığının nedeni de budur. Model.Id'yi seçili değerler olarak geçiriyorsunuz ve URL'leri seçenek değerleri olarak kullanıyorsunuz. İyi değil.ID'yi seçenek değeri olarak korumanızı ve gerekirse ilgili URL'yi göndermiş olduğunuz denetleyici eylemine getirmenizi tavsiye ederim. URL'leri seçenek değerleri olarak kullanmak mantıklı görünmüyor. –

+0

Orijinal kodumda kimlikleri seçili değerler ve URL'ler olarak seçenek değerleri olarak aktarmıyorum. Yaptığım şey, değerleri URL’lere ayarlamak ve ardından öğenin seçilmesi gereken bir koşul kullanmaktır. Ve değerlerin URL'lerini neden kullanmamam gerektiği konusunda herhangi bir zorlayıcı neden var mı? –

0

Bu konseptle çok fazla sorun yaşadım. Özellikle, bir nesnede bu özelliği içeren modelden "name" özelliğini geçiremediğiniz zaman kendini gösterir, çünkü bu nesne adı otomatik olarak adaya eklenir. Bu çılgınca. Bunu anlamaya çalışırken saatlerce harcadıktan sonra pes ettim ve burada yayınladığım kendi Drop-Down uzantımımı yazdım. Çok basit ve gayet iyi çalışıyor. Eğer niteliklerin standart anonim listesi ile kendisine bağlamak istiyorsanız, oldukça güçlük olabilir çünkü

public static MvcHtmlString SimpleDropDown(this HtmlHelper helper, object attributes, IEnumerable<SelectListItem> items, bool disabled = false) 
    { 
     XElement e = new XElement("select", 
      items.Select(a => { 
       XElement option = new XElement("option", a.Text); 
       option.SetAttributeValue("value", a.Value); 
       if (a.Selected) 
        option.SetAttributeValue("selected", "selected"); 
       return option; 
      }) 
      ); 

     if (attributes != null) 
     { 
      Dictionary<string, string> values = (from x in attributes.GetType().GetProperties() select x).ToDictionary(x => x.Name, x => (x.GetGetMethod().Invoke(attributes, null) == null ? "" : x.GetGetMethod().Invoke(attributes, null).ToString())); 
      foreach(var v in values) 
       e.SetAttributeValue(v.Key, v.Value); 
     } 

     if (disabled) 
      e.SetAttributeValue("disabled", ""); 

     return new MvcHtmlString(e.ToString()); 
    } 

Ayrıca, ekstra bir parametre olarak bayrağı özürlü koydu.

Aşağıda, onu nasıl kullandığımın bir örneği verilmiştir. Bir sözlüğü SelectListItem listesine çeviririm, ancak sadece basit bir liste olabilir.

@Html.SimpleDropDown(new { id="EOM", name = "EOM", @class = "topBox" }, Model.EOM.Select(x => new SelectListItem { Text = x.Value, Value = x.Key.ToString(), Selected = Model.EOM.Selected == x.Key }), !Model.EOM.Available)