Basit bir Html.DropDownListFor () nasıl yazılır?


133

ASP.NET MVC 2'de, statik seçenekler sunan çok basit bir açılır liste yazmak istiyorum. Örneğin, "Kırmızı", "Mavi" ve "Yeşil" arasında seçenekler sunmak istiyorum.

Yanıtlar:


188

Bu MSDN makalesine ve Stack Overflow'da bir örnek kullanıma bakın .

Aşağıdaki Linq / POCO sınıfına sahip olduğunuzu varsayalım:

public class Color
{
    public int ColorId { get; set; }
    public string Name { get; set; }
}

Ve aşağıdaki modele sahip olduğunuzu varsayalım:

public class PageModel 
{
   public int MyColorId { get; set; }
}

Ve son olarak, aşağıdaki renk listesine sahip olduğunuzu varsayalım. Bir Linq sorgusundan, statik bir listeden vb. Gelebilirler:

public static IEnumerable<Color> Colors = new List<Color> { 
    new Color {
        ColorId = 1,
        Name = "Red"
    },
    new Color {
        ColorId = 2,
        Name = "Blue"
    }
};

Sizin görünümünüzde aşağıdaki gibi bir açılır liste oluşturabilirsiniz:

<%= Html.DropDownListFor(n => n.MyColorId, 
                         new SelectList(Colors, "ColorId", "Name")) %>

1
bu gerçekten net. IEnumerable <Color> kodunu kodumun neresine koymam gerektiğini bilmek istiyorum? Soru olarak aptalca göründüğünü biliyorum ama çok kayboldum ve bu konuda
yeniyim

7
Endişelenme dostum. Nasıl hissettirdiğini biliyorum. :) İlk sorunuzda önerdiğiniz gibi, bu kodda oluşturacağınız statik bir liste mi yoksa bu listeyi bir veritabanından mı çekeceksiniz?
Evan Nagle

bir veri tabanı oluşturmayan 4 seçenek içeren statik bir liste
Rinesse

6
"HtmlLists" veya başka bir adla statik bir sınıf oluşturun. Statik sınıfı System.Web.Mvc ad alanına yerleştirin. Statik sınıfınızda, IEnumerable <Color> Colors statik listenizi ekleyin. Ardından, kendi görünümünüzde HtmlLists.Colors'ı çağırarak referans verebilirsiniz. Umarım mantıklıdır. Bilmeme izin ver. :)
Evan Nagle

2
Bunu nasıl yapacağımı bilmiyordum: '(... Renk sınıfını ve Html Listelerini nereye koyacağımı (modeller klasöründe olabilir mi?) Ve görünümde nasıl referans vereceğimi bilmiyorum. Aloso a nasıl koyacağımı bilmiyorum Görünümün bir özniteliğindeki listenin sonucuModel.. Çok kafam karıştı: /
Rinesse

61
<%: 
     Html.DropDownListFor(
           model => model.Color, 
           new SelectList(
                  new List<Object>{ 
                       new { value = 0 , text = "Red"  },
                       new { value = 1 , text = "Blue" },
                       new { value = 2 , text = "Green"}
                    },
                  "value",
                  "text",
                   Model.Color
           )
        )
%>

veya hiçbir sınıf yazamazsınız, doğrudan görünüme böyle bir şey koyamazsınız.


2
Kodunuzu denediğinizde aşağıdaki hatayı alıyorum: "Nesne başvurusu bir nesnenin örneğine ayarlanmadı."
Beşar Ebu Shamaa

12
görüşünüze model mantığı eklemek için kötü bir fikir
Daniël Tulp

34

Modelde bir Sözlük ile başlayarak çok fazla şişman parmaktan kaçının

namespace EzPL8.Models
{
    public class MyEggs
    {
        public Dictionary<int, string> Egg { get; set; }

        public MyEggs()
        {
            Egg = new Dictionary<int, string>()
            {
                { 0, "No Preference"},
                { 1, "I hate eggs"},
                { 2, "Over Easy"},
                { 3, "Sunny Side Up"},
                { 4, "Scrambled"},
                { 5, "Hard Boiled"},
                { 6, "Eggs Benedict"}
            };

    }


    }

Görünümde görüntülemek için bir listeye dönüştürün

@Html.DropDownListFor(m => m.Egg.Keys,
                         new SelectList(
                             Model.Egg, 
                             "Key", 
                             "Value"))

32

Merhabalar, bunu bir projede nasıl yaptım:

     @Html.DropDownListFor(model => model.MyOption,                
                  new List<SelectListItem> { 
                       new SelectListItem { Value = "0" , Text = "Option A" },
                       new SelectListItem { Value = "1" , Text = "Option B" },
                       new SelectListItem { Value = "2" , Text = "Option C" }
                    },
                  new { @class="myselect"})

Umarım birisine yardımcı olur. Teşekkürler


12

Veya bir veritabanı bağlamından geliyorsa,

@Html.DropDownListFor(model => model.MyOption, db.MyOptions.Select(x => new SelectListItem { Text = x.Name, Value = x.Id.ToString() }))

23
Lütfen bu tür saçmalıkları teşvik etmeyin. Sizin üzerinizde olan Razor görünümlerinizde db bağlamınıza atıfta bulunmaktan hoşlanıyorsanız, ancak bizler için yazılımı doğru şekilde inşa etmeyi seviyorsanız, bu korkunç bir fikirdir. Razor görünümünüzü bir görünüm modeli sınıfına bağlayın; görünüm için gereken tüm veriler, denetleyici tarafından oluşturulan görünüm modelinin bir örneğinde depolanır. Bu, .Net'ten uzaklaşmamın bir parçası, çok sayıda korkunç geliştirici, kodlarıyla korkunç şeyler yapıyor ve diğer herkes için büyük baş ağrısı yaratıyor. Bahse girerim tüm iş mantığınızı kontrol cihazlarınıza koymuşsunuzdur!
JBeckton

7
Öncelikle, herhangi bir gramer hatası için özür dilerim, çünkü ingilizce benim ana dilim değil. Birinin böyle düşünceli bir yorum yaptığını görmek her zaman güzeldir, sizi alkışlarım efendim, katkıda bulunmak için zaman ayırdınız. Benimki işe yaramayacağından, geliştiricilerin mesleğinin sizinki kadar iyi ellerde olması her zaman güven vericidir. Senin cahil yorumunun beğenileri, artık buraya neden hiç gönderi paylaşmadığımdır. Bunu yazdığımda eğitimimin 8 ay olduğunu ve Web Geliştirme'ye daha önce hiç dokunmamış olduğumu size bildirebilir miyim? Sahip olduğum az bilgiyle farklı bir yaklaşımı paylaşmak istedim.
Joel Wahlund

7
8 ay mı? Öyleyse, nasıl yapılacağını bilemediğiniz halde neden sorunları çözmeye çalışasınız? Yorumum cahil olmaktan uzak, bu şeyleri her gün görüyorum. Meslektaşlarınıza mecbur ettiğiniz el işi miktarını düşünmeye başlamalısınız. yüzlerce görünüme sahip bir kurumsal uygulamanız olduğunu ve CTO'nuzun Oracle DB'ye geçmek istediğini düşünün. Sadece bir satır kodunuz nedeniyle açılır listeleri kullanan tüm görünümleri ve denetleyicileri yeniden düzenlemenin gerçek maliyetini hayal edin! Size hakaret etmeye çalışmıyorum, sadece size küçük bir tavsiyenin ne kadar büyük etkileri olabileceğini açıklamaya çalışıyorum.
JBeckton

2
Statik numaralandırma tabanlı çözümleri yeniden düzenleme gerekliliğinden farklı değildir. En azından işletme listeye her renk eklemek istediğinde bu bir kod değişikliği değildi. Daha fazla insan bir veritabanını kullanmayı düşünürse dünya daha iyi bir yer olurdu.
m12lrpv

3
Arada bir ziyaret ettiğimde bu iplik yüzüme bir gülümseme getiriyor. @SeanT noktasını biraz daha iyi anlıyorum. Sanırım yardım etmeye çalışırken genel olarak bir saldırı hissettim. Bugünlerde her şeyi katmanlarla ayırmayı ve ViewModel'lere ayrılmadığı sürece hiçbir şeyin görünüme dokunmasına izin vermemeyi kendime tercih ediyorum. Ben de böyle yapmaktan hoşlanıyorum. M12lrpv'nin beni savunmaya almasını takdir ediyorum :-)
Joel Wahlund

7

"Lütfen bir Öğe seçin" ile

@Html.DropDownListFor(model => model.ContentManagement_Send_Section,
  new List<SelectListItem> { new SelectListItem { Value = "0", Text = "Plese Select one Item" } }
    .Concat(db.NameOfPaperSections.Select(x => new SelectListItem { Text = x.NameOfPaperSection, Value = x.PaperSectionID.ToString() })),
  new { @class = "myselect" })  

Kodlardan türetilmiştir: Master Programmer && Joel Wahlund ;
King Referansı: https://stackoverflow.com/a/1528193/1395101 JaredPar ;

Teşekkürler Usta Programcı && Joel Wahlund && JaredPar ;

İyi şanslar arkadaşlar.


1
@using (Html.BeginForm()) {
    <p>Do you like pizza?
        @Html.DropDownListFor(x => x.likesPizza, new[] {
            new SelectListItem() {Text = "Yes", Value = bool.TrueString},
            new SelectListItem() {Text = "No", Value = bool.FalseString}
        }, "Choose an option") 
    </p>
    <input type = "submit" value = "Submit my answer" />
} 

Bence bu yanıt, DropDownList'inizin tüm kodunu doğrudan görünümde koyduğunuz için Berat'ın yanıtına benzer. Ama bunun ay / n (boolean) açılır listesi oluşturmanın etkili bir yolu olduğunu düşünüyorum, bu yüzden paylaşmak istedim.

Yeni başlayanlar için bazı notlar:

  • 'X' adının ne olduğu konusunda endişelenmeyin - burada, ilk kez oluşturulur ve MVC uygulamasında başka hiçbir yere bağlanmaz, böylece ona istediğiniz gibi diyebilirsiniz - 'x', "model", "m" vb.
  • Kullanıcıların açılır listede göreceği yer tutucu "Bir seçenek belirleyin" dir, böylece isterseniz bunu değiştirebilirsiniz.
  • Açılır listenin önünde "Pizza sever misin?" Yazan bir metin var.
  • Bu, bir gönder düğmesi de dahil olmak üzere bir form için tam metin olmalıdır.

Umarım bu birine yardımcı olur,

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.