Html.DropdownList สำหรับค่าที่เลือกไม่ได้ถูกตั้งค่า


100

ฉันจะตั้งค่าที่เลือกของ Html.DropDownListFor ได้อย่างไร ฉันได้ดูออนไลน์และได้เห็นว่าสามารถทำได้โดยใช้พารามิเตอร์ที่สี่ดังต่อไปนี้:

@Html.DropDownListFor(m => m, new SelectList(Model, "Code", "Name", 0),  "Please select a country")

รายการเลือกของฉันจากนั้นจะแสดงดังนี้:

<select id="ShipFromCountries" name="ShipFromCountries">
     <option value="">Please select a country</option>
     <option value="GB">United Kingdom</option>
     <option value="US">United States</option>
     ...
</select>

แต่ด้วยเหตุผลบางประการสหราชอาณาจักรยังคงถูกเลือก แต่ฉันต้องการให้เลือก "โปรดเลือกประเทศ"

ใครรู้ว่าฉันจะบรรลุเป้าหมายนี้ได้อย่างไร?

แก้ไข

ฉันได้อัปเดตรหัสของฉันเนื่องจากมีการเปลี่ยนแปลงการทำงานเล็กน้อย แต่ดูเหมือนว่าจะยังคงพบปัญหานี้อยู่ นี่คือสิ่งที่อยู่ในมุมมองของฉัน:

@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

1เป็นรหัสของoptionที่ฉันต้องการเลือกฉันได้ลองใช้กับข้อความของoptionแต่ก็ใช้ไม่ได้เช่นกัน

ความคิดใด ๆ ?

คำตอบ:


183

รหัสของคุณมีปัญหาด้านแนวคิด:

ครั้งแรก ,

@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

เมื่อใช้ DropDownListFor พารามิเตอร์แรกคือคุณสมบัติที่เก็บค่าที่คุณเลือกไว้เมื่อคุณส่งแบบฟอร์ม ดังนั้นในกรณีของคุณคุณควรมีSelectedOrderIdเป็นส่วนหนึ่งของโมเดลของคุณหรืออะไรทำนองนั้นเพื่อใช้ในลักษณะนี้:

@Html.DropDownListFor(n => n.SelectedOrderId, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

ประการที่สอง ,

นอกเหนือจากการใช้ ViewBag นั่นไม่ใช่เรื่องผิด แต่มีวิธีที่ดีกว่า (ใส่ข้อมูลนั้นใน ViewModel แทน) มี "จุดบกพร่องเล็กน้อย" (หรือพฤติกรรมที่ไม่ได้ตรวจสอบ) เมื่อคุณสมบัติ ViewBag ของคุณซึ่งคุณถือ SelectList อยู่ ชื่อเดียวกันของคุณสมบัติที่คุณใส่ค่าที่เลือก เพื่อหลีกเลี่ยงสิ่งนี้เพียงใช้ชื่ออื่นเมื่อตั้งชื่อคุณสมบัติที่มีรายการของรายการ

รหัสบางอย่างที่ฉันจะใช้ถ้าฉันเป็นคุณเพื่อหลีกเลี่ยงปัญหานี้และเขียนโค้ด MVC ให้ดีขึ้น:

ดูโมเดล:

public class MyViewModel{
   public int SelectedOrderId {get; set;}
   public SelectList OrderTemplates {get; set;}

   // Other properties you need in your view
}

ตัวควบคุม:

public ActionResult MyAction(){
   var model = new MyViewModel();
   model.OrderTemplates = new SelectList(db.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1);
   //Other initialization code

   return View(model);
}

ในมุมมองของคุณ:

@Html.DropDownListFor(n => n.SelectedOrderId, Model.OrderTemplates, "Please select an order template")

44
บันทึกวันของฉัน: "... มีข้อผิดพลาดเล็กน้อยเมื่อคุณสมบัติ ViewBag ของคุณที่คุณถือ SelectList เป็นชื่อเดียวกับคุณสมบัติที่คุณใส่ค่าที่เลือกเพื่อหลีกเลี่ยงปัญหานี้ให้ใช้ชื่ออื่นเมื่อตั้งชื่อคุณสมบัติที่ถือ รายการ " ขอขอบคุณ!
Michael A.Volz aka Flynn

4
"บักน้อย" คนนี้บ้าแน่นอน! แค่เสียชีวิตไป 2 ชั่วโมงเพราะเหตุนี้ บางสิ่งที่ชัดเจนยังคงมีอยู่และไม่ได้รับการแก้ไขได้อย่างไร
cen

1
ฟลินน์ความคิดเห็นของคุณควรเป็นคำตอบ ฉันลองใช้งานอย่างบ้าคลั่งเพื่อให้รายการแบบเลื่อนลงของฉันทำงานได้และนี่เป็นวิธีง่ายๆ
Dwayne Hinterlang

2
มีข้อผิดพลาดเล็กน้อย ? มันไม่ใช่ข้อผิดพลาดเลย รุ่นที่มีผลผูกพันการทำงานโดยมีผลผูกพันกับมูลค่าของทรัพย์สินและเมื่อคุณผูกไว้กับOrderTemplatesความพยายามของคุณเพื่อเชื่อมโยงกับViewBagสถานที่ให้บริการซึ่งเป็น IEnumerabe<SelectListItem>typeof แต่<select>องค์ประกอบไม่สามารถผูกกับคอลเล็กชันของวัตถุที่ซับซ้อนได้ (เฉพาะประเภทค่า)

ฉันจะเสียเวลาทั้งวันถ้าไม่ใช่เพราะคำตอบนี้ อย่างจริงจังว่า LITTLE BUG คือเหตุผลที่เราควรประกันตัวใน viewbag
Worthy7

23

สำหรับฉันไม่ได้ทำงานดังนั้นวิธีนี้:

ตัวควบคุม:

int selectedId = 1;

ViewBag.ItemsSelect = new SelectList(db.Items, "ItemId", "ItemName",selectedId);

ดู:

@Html.DropDownListFor(m => m.ItemId,(SelectList)ViewBag.ItemsSelect)

jQuery:

$("document").ready(function () {
    $('#ItemId').val('@Model.ItemId');
});

2
คอนโทรลเลอร์ของคุณมีจำนวนวงเล็บที่ไม่ถูกต้อง: มีวงเล็บเปิดหนึ่งวงเล็บและวงเล็บปิด
Amos Long

7

เมื่อคุณส่งผ่านวัตถุเช่นนี้:

new SelectList(Model, "Code", "Name", 0)

คุณจะพูด: แหล่งที่มา ( Model) และ (Key "Code") ข้อความ ( "Name") 0และค่าที่เลือก คุณอาจไม่มี0ค่าในแหล่งที่มาของCodeคุณสมบัติดังนั้นตัวช่วย HTML จะเลือกองค์ประกอบแรกเพื่อส่งผ่านค่าที่เลือกจริงไปยังตัวควบคุมนี้


3

ตรวจสอบให้แน่ใจว่าคุณได้ตัดแต่งค่าที่เลือกไว้ก่อนกำหนด

// แบบ

public class SelectType
{
    public string Text { get; set; }
    public string Value { get; set; }
}

// ตัวควบคุม

var types = new List<SelectType>();
types.Add(new SelectType() { Value =  0, Text = "Select a Type" });
types.Add(new SelectType() { Value =  1, Text = "Family Trust" });
types.Add(new SelectType() { Value =  2, Text = "Unit Trust"});
ViewBag.PartialTypes = types;

//ดู

@Html.DropDownListFor(m => m.PartialType, new SelectList(ViewBag.PartialTypes, "Value", "Text"), new { id = "Type" })

2

หากคุณรู้ว่าจะมีอะไรอยู่ในมุมมองคุณสามารถตั้งค่าเริ่มต้นจากคอนโทรลเลอร์ได้เช่นกันจากนั้นตั้งค่าลงในไฟล์ view / cshtml ไม่จำเป็นต้องตั้งค่าเริ่มต้นจากฝั่ง HTML

ในไฟล์ Controller

commission.TypeofCommission = 1;
return View(commission);

ในไฟล์. cshtml

@Html.DropDownListFor(row => row.TypeofCommission, new SelectList(Model.commissionTypeModelList, "type", "typeName"), "--Select--")

1

คุณควรลืมชั้นเรียน

SelectList

ใช้สิ่งนี้ในคอนโทรลเลอร์ของคุณ:

var customerTypes = new[] 
{ 
    new SelectListItem(){Value = "all", Text= "All"},
    new SelectListItem(){Value = "business", Text= "Business"},
    new SelectListItem(){Value = "private", Text= "Private"},
};

เลือกค่า:

var selectedCustomerType = customerTypes.FirstOrDefault(d => d.Value == "private");
if (selectedCustomerType != null)
    selectedCustomerType.Selected = true;

เพิ่มรายการลงใน ViewData:

ViewBag.CustomerTypes = customerTypes;

ใช้สิ่งนี้ในมุมมองของคุณ:

@Html.DropDownList("SectionType", (SelectListItem[])ViewBag.CustomerTypes)

-

ข้อมูลเพิ่มเติมที่: http://www.asp.net/mvc/overview/older-versions/working-with-the-dropdownlist-box-and-jquery/using-the-dropdownlist-helper-with-aspnet-mvc


0

เพิ่มส่วนควบคุม

  ViewBag.Orders= new SelectList(db.Orders, "Id", "business", paramid);

เพิ่มส่วน Html

   @Html.DropDownList("Orders", null)

วิธีการง่ายๆ


การประมวลผลธุรกรรมทางเลือกที่ง่าย
ibrahim ozboluk

0

สำหรับฉันวิธีแก้ปัญหาทั่วไป :)

@{
     var selectedCity = Model.Cities.Where(k => k.Id == Model.Addres.CityId).FirstOrDefault();
     if (selectedCity != null)
     { 
         @Html.DropDownListFor(model => model.Addres.CityId, new SelectList(Model.Cities, "Id", "Name", selectedCity.Id), new { @class = "form-control" })
     }
     else
     { 
         @Html.DropDownListFor(model => model.Cities, new SelectList(Model.Cities, "Id", "Name", "1"), new { @class = "form-control" })
     }
}

0

Linq to Dropdown พร้อมรายการว่างรายการที่เลือก (ใช้งานได้ 100%)
(พิมพ์แน่นโอกาสเกิดข้อผิดพลาดต่ำสุด) การเปลี่ยนแปลงโมเดลใด ๆ จะแสดงในการผูก

ตัวควบคุม

public ActionResult ManageSurveyGroup()
    {
        tbl_Survey sur = new tbl_Survey();
        sur.Survey_Est = "3";

        return View(sur);
    }

ดู

        @{


    //Step One : Getting all the list
    var CompEstdList = (from ComType in db.tbl_CompEstdt orderby ComType.Comp_EstdYr select ComType).ToList();

    //Step Two  : Adding a no Value item **
    CompEstdList.Insert(0, new eDurar.Models.tbl_CompEstdt { Comp_Estdid = 0, Comp_EstdYr = "--Select Company Type--" });

    //Step Three : Setting selected Value if value is present
    var selListEstd= CompEstdList.Select(s => new SelectListItem { Text = s.Comp_EstdYr, Value = s.Comp_Estdid.ToString() });

        }
        @Html.DropDownListFor(model => model.Survey_Est, selListEstd)
        @Html.ValidationMessageFor(model => model.Survey_Est)

วิธีนี้ในการผูกข้อมูลก็ทำได้เช่นกัน

var selList = CompTypeList.Select(s => new SelectListItem { Text = s.CompTyp_Name, Value = s.CompTyp_Id.ToString(), Selected = s.CompTyp_Id == 3 ? true : false });

var selList = CompTypeList.Select (s => new SelectListItem {Text = s.CompTyp_Name, Value = s.CompTyp_Id ToString (), Selected = s.CompTyp_Id == 3? true: false});

0

ฉันรู้ว่านี่ไม่ใช่คำตอบสำหรับคำถาม แต่ฉันกำลังมองหาวิธีเริ่มต้น DropDownList จากรายการได้ทันทีในมุมมองเมื่อฉันสะดุดกับโพสต์นี้

ความผิดพลาดของฉันคือฉันพยายามสร้าง SelectList จากพจนานุกรมดังนี้:

//wrong!
@Html.DropDownListFor(m => m.Locality, new SelectList(new Dictionary<string, string>() { { Model.Locality, Model.Locality_text } }, Model.Locality, ...

จากนั้นฉันไปขุดในmsdn docอย่างเป็นทางการและพบว่าDropDownListForไม่จำเป็นต้องใช้ a SelectListแต่เป็นIEnumerable<SelectListItem>:

//right
@Html.DropDownListFor(m => m.Locality, new List<SelectListItem>() { new SelectListItem() { Value = Model.Locality, Text = Model.Locality_text, Selected = true } }, Model.Locality, new { @class = "form-control select2ddl" })

ในกรณีของฉันฉันอาจละเว้นรายการModel.Localityas ที่เลือกได้เนื่องจากเป็นรายการ a) รายการเดียวและ b) ที่ระบุไว้ในSelectListItem.Selectedคุณสมบัติแล้ว

ในกรณีที่คุณสงสัยแหล่งข้อมูลคือเพจ AJAX ที่โหลดแบบไดนามิกโดยใช้ตัวควบคุม SelectWoo / Select2


0
public byte UserType
public string SelectUserType

คุณต้องได้รับหนึ่งและตั้งค่าที่แตกต่างกัน ค่าที่เลือกต้องไม่เป็นรายการเดียวกับที่คุณกำลังจะตั้งค่า

@Html.DropDownListFor(p => p.SelectUserType, new SelectList(~~UserTypeNames, "Key", "Value",UserType))

ฉันใช้พจนานุกรม Enum สำหรับรายการของฉันนั่นคือเหตุผลที่มีคู่ "คีย์", "ค่า"



0

นี่คือปัญหา CSS ฉันไม่รู้ว่าทำไม @ Html.DropDownListFor ใน Bootstrap 4 ถึงทำงานได้ดีที่สุด แน่นอนว่านี่คือปัญหาการออกแบบชั้นเรียน อย่างไรก็ตามการทำงานคือถ้าช่องป้อนข้อมูลแบบหล่นลงของคุณมี CSS Padding: #px, # px; จากนั้นปิดการใช้งาน หวังว่าจะได้ผล

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