วิธีการเขียน Html.DropDownListFor () อย่างง่าย?


132

ใน ASP.NET MVC 2 ฉันต้องการเขียนรายการแบบเลื่อนลงที่เรียบง่ายซึ่งให้ตัวเลือกคงที่ ตัวอย่างเช่นฉันต้องการระบุตัวเลือกระหว่าง "แดง" "น้ำเงิน" และ "เขียว"

คำตอบ:


187

ดูบทความนี้ MSDNและตัวอย่างการใช้งานที่นี่ในกองมากเกิน

สมมติว่าคุณมีคลาส Linq / POCO ดังต่อไปนี้:

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

และสมมติว่าคุณมีโมเดลต่อไปนี้:

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

สุดท้ายนี้สมมติว่าคุณมีรายการสีดังต่อไปนี้ อาจมาจากแบบสอบถาม Linq จากรายการคงที่ ฯลฯ :

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

ในมุมมองของคุณคุณสามารถสร้างรายการแบบเลื่อนลงดังนี้:

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

1
ที่ชัดเจนจริงๆ ฉันต้องการทราบว่าฉันควรใส่ IEnumerable <Color> ไว้ที่ใดในโค้ดของฉัน ฉันรู้ว่ามันดูโง่เป็นคำถาม แต่ฉันหลงทางและใหม่มาก: s
Rinesse

7
ไม่ต้องกังวลเพื่อน ฉันรู้ว่ามันรู้สึกอย่างไร :) ตามที่คุณแนะนำไว้ในคำถามเริ่มต้นนี่เป็นรายการคงที่ที่คุณกำลังจะสร้างในโค้ดหรือคุณกำลังจะดึงรายการนี้จากฐานข้อมูล?
Evan Nagle

รายการแบบคงที่ซึ่งมี 4 ตัวเลือกที่ไม่ได้สร้างฐานข้อมูล
Rinesse

6
สร้างคลาสแบบคงที่ชื่อ "HtmlLists" หรืออะไรสักอย่าง วางคลาสแบบคงที่ในเนมสเปซ System.Web.Mvc ในคลาสแบบคงที่ของคุณให้เพิ่มรายการสี <Color> แบบคงที่ของ IEnumerable จากนั้นในมุมมองของคุณคุณสามารถอ้างอิงได้โดยเรียก HtmlLists.Colors หวังว่าจะสมเหตุสมผล แจ้งให้เราทราบ :)
Evan Nagle

2
ฉันไม่รู้ว่าจะต้องทำอย่างไร: '(... ฉันไม่รู้ว่าจะวางแถบสีและรายการ HtmlLists ไว้ที่ใด (ในโฟลเดอร์รุ่นอาจเป็น?) และวิธีการอ้างอิงในมุมมองอย่างไรก็ตามไม่รู้ว่าจะใส่อย่างไร ผลลัพธ์ของ liste ในแอตทริบิวต์ของ viewModel .. ฉันสับสนมาก: /
Rinesse

64
<%: 
     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
           )
        )
%>

หรือจะไม่เขียนคลาสใส่อะไรแบบนี้ลงในมุมมองโดยตรง


2
ฉันได้รับข้อผิดพลาดด้านล่างเมื่อลองใช้รหัสของคุณ: "การอ้างอิงวัตถุไม่ได้ตั้งค่าเป็นตัวอย่างของวัตถุ"
Bashar Abu Shamaa

14
ความคิดที่ไม่ดีในการเพิ่มตรรกะของโมเดลในมุมมองของคุณ
Daniël Tulp

34

หลีกเลี่ยงการใช้นิ้วไขมันจำนวนมากโดยเริ่มจาก Dictionary ใน Model

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"}
            };

    }


    }

ในมุมมองแปลงเป็นรายการสำหรับการแสดงผล

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

32

สวัสดีนี่คือวิธีที่ฉันทำในโครงการเดียว:

     @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"})

ฉันหวังว่ามันจะช่วยใครสักคน ขอบคุณ


12

หรือถ้ามาจากบริบทฐานข้อมูลคุณสามารถใช้ได้

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

24
กรุณาอย่าสนับสนุนให้เกิดเรื่องไร้สาระแบบนี้ หากคุณชอบอ้างอิงบริบทฐานข้อมูลของคุณในมุมมอง Razor ที่มีต่อคุณ แต่สำหรับพวกเราที่ชอบสร้างซอฟต์แวร์ด้วยวิธีที่ถูกต้องนี่เป็นความคิดที่แย่มาก เชื่อมโยงมุมมอง Razor ของคุณกับคลาสโมเดลมุมมองข้อมูลใด ๆ ที่จำเป็นสำหรับมุมมองจะถูกเก็บไว้ในอินสแตนซ์ของโมเดลมุมมองที่สร้างโดยคอนโทรลเลอร์ นี่เป็นส่วนหนึ่งของเหตุผลที่ฉันหนีจาก. Net นักพัฒนาที่แย่มากเกินไปที่ทำสิ่งเลวร้ายด้วยรหัสของพวกเขาทำให้คนอื่นปวดหัวอย่างมาก ฉันพนันได้เลยว่าคุณใส่ตรรกะทางธุรกิจทั้งหมดไว้ในตัวควบคุมของคุณ!
JBeckton

7
ก่อนอื่นขออภัยสำหรับการรวมไวยากรณ์ใด ๆ เนื่องจากภาษาอังกฤษไม่ใช่ภาษาแรกของฉัน เป็นเรื่องดีเสมอที่ได้เห็นใครบางคนแสดงความคิดเห็นอย่างรอบคอบฉันขอปรบมือให้คุณที่คุณสละเวลาในการมีส่วนร่วม นอกจากนี้ยังทำให้มั่นใจได้เสมอว่าอาชีพของนักพัฒนาอยู่ในมือที่ดีเช่นเดียวกับคุณเนื่องจากฉันจะไม่ทำ การชอบความคิดเห็นที่ไม่รู้ของคุณคือทำไมฉันไม่โพสต์ที่นี่อีกต่อไป ฉันขอแจ้งให้คุณทราบว่าตอนที่ฉันเขียนสิ่งนี้ฉันเรียนอยู่ 8 เดือนและไม่เคยสัมผัสกับการพัฒนาเว็บมาก่อน ฉันต้องการแบ่งปันความรู้เล็ก ๆ น้อย ๆ ที่ฉันมี
Joel Wahlund

8
8 เดือน? แล้วทำไมต้องพยายามแก้ปัญหาในเมื่อคุณไม่สามารถรู้ได้อย่างไร? ความคิดเห็นของฉันอยู่ห่างไกลจากความไม่รู้ฉันเห็นสิ่งนี้ทุกวัน คุณต้องเริ่มพิจารณาจำนวนงานด้วยตนเองที่คุณต้องรับผิดชอบต่อเพื่อนร่วมงานของคุณ ลองจินตนาการว่าคุณมีแอปพลิเคชันระดับองค์กรที่มีมุมมองหลายร้อยครั้งและ CTO ของคุณต้องการเปลี่ยนไปใช้ Oracle DB ลองนึกภาพค่าใช้จ่ายที่แท้จริงในการปรับโครงสร้างมุมมองและคอนโทรลเลอร์ทั้งหมดที่ใช้รายการแบบเลื่อนลงเพียงเพราะโค้ดบรรทัดเดียวของคุณ! ฉันไม่ได้พยายามดูถูกคุณเพียงแค่พยายามอธิบายให้คุณเข้าใจว่าคำแนะนำที่ไม่ดีเพียงเล็กน้อยสามารถส่งผลกระทบอย่างมากได้อย่างไร
JBeckton

2
ไม่ต่างอะไรกับการต้อง refactor โซลูชันแบบคงที่ที่ใช้ enum อย่างน้อยก็ไม่ใช่การเปลี่ยนรหัสทุกครั้งที่ธุรกิจต้องการเพิ่มสีสันให้กับรายการ หากมีคนคิดจะใช้ฐานข้อมูลมากขึ้นโลกก็จะน่าอยู่
m12lrpv

4
กระทู้นี้ทำให้ใบหน้าของฉันมีรอยยิ้มเมื่อฉันไปเยี่ยมทุกๆครั้ง ฉันเข้าใจ @SeanT point ดีขึ้นอีกนิด ฉันเดาว่าฉันรู้สึกถึงการโจมตีโดยทั่วไปเมื่อฉันพยายามช่วย วันนี้ฉันชอบตัวเองมากที่จะแยกทุกอย่างตามเลเยอร์และไม่ให้สิ่งใดมาสัมผัสมุมมองเว้นแต่จะแยกออกเป็น ViewModels เป็นเพียงวิธีที่ฉันชอบทำด้วยตัวเอง ฉันขอขอบคุณ m12lrpv ที่พาฉันไปป้องกันคุณ :-)
Joel Wahlund

7

ด้วย "โปรดเลือกหนึ่งรายการ"

@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" })  

ได้มาจากรหัส: Master Programmer && Joel Wahlund ;
อ้างอิงคิง: https://stackoverflow.com/a/1528193/1395101 JaredPar ;

ขอบคุณMaster Programmer && Joel Wahlund && JaredPar ;

ขอให้โชคดีนะเพื่อน


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" />
} 

ฉันคิดว่าคำตอบนี้คล้ายกับของ Berat ตรงที่คุณใส่รหัสทั้งหมดสำหรับ DropDownList ของคุณโดยตรงในมุมมอง แต่ฉันคิดว่านี่เป็นวิธีที่มีประสิทธิภาพในการสร้างรายการแบบเลื่อนลง ay / n (บูลีน) ดังนั้นฉันจึงต้องการแบ่งปัน

หมายเหตุสำหรับผู้เริ่มต้น:

  • ไม่ต้องกังวลว่า "x" จะเรียกว่าอะไร - สร้างขึ้นที่นี่เป็นครั้งแรกและไม่เชื่อมโยงกับสิ่งอื่นใดในแอป MVC ดังนั้นคุณสามารถเรียกมันว่าสิ่งที่คุณต้องการ - 'x', 'model', 'm' เป็นต้น
  • ตัวยึดตำแหน่งที่ผู้ใช้จะเห็นในรายการแบบเลื่อนลงคือ "เลือกตัวเลือก" ดังนั้นคุณสามารถเปลี่ยนได้ตามต้องการ
  • มีข้อความเล็กน้อยก่อนรายการแบบเลื่อนลงซึ่งระบุว่า "คุณชอบพิซซ่าไหม"
  • ฉันคิดว่านี่ควรเป็นข้อความที่สมบูรณ์สำหรับแบบฟอร์มรวมถึงปุ่มส่งด้วย

หวังว่านี่จะช่วยใครสักคน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.