Html.DropdownListĐối với giá trị đã chọn không được đặt


97

Làm cách nào để đặt giá trị đã chọn của Html.DropDownListFor? Tôi đã xem trực tuyến và thấy rằng nó có thể đạt được bằng cách sử dụng tham số thứ tư, giống như dưới đây:

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

Danh sách lựa chọn của tôi sau đó hiển thị như thế này:

<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>

Nhưng vì lý do nào đó Vương quốc Anh vẫn được chọn nhưng tôi muốn chọn "Vui lòng chọn một quốc gia".

Bất cứ ai biết làm thế nào tôi có thể đạt được điều này?

BIÊN TẬP

Tôi đã cập nhật mã của mình vì có một chút thay đổi về chức năng, tuy nhiên dường như vẫn gặp sự cố này. Đây là những gì theo quan điểm của tôi:

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

1là Id của optionmà tôi muốn chọn, tôi cũng đã thử với văn bản của optionnhưng điều đó cũng không hoạt động.

Bất kỳ ý tưởng?

Câu trả lời:


181

Mã của bạn có một số vấn đề về khái niệm:

Đầu tiên ,

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

Khi sử dụng DropDownListFor, tham số đầu tiên là thuộc tính nơi lưu trữ giá trị đã chọn của bạn sau khi bạn gửi biểu mẫu. Vì vậy, trong trường hợp của bạn, bạn nên có một SelectedOrderIdbộ phận như một phần của mô hình của mình hoặc một cái gì đó tương tự, để sử dụng nó theo cách này:

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

Thứ hai ,

Ngoài việc sử dụng ViewBag, điều đó không sai nhưng có nhiều cách tốt hơn (thay vào đó hãy đặt thông tin đó vào ViewModel), có một "lỗi nhỏ" (hoặc một hành vi không được tôn trọng) khi thuộc tính ViewBag của bạn, nơi bạn đang giữ SelectList, cùng tên của thuộc tính nơi bạn đặt giá trị đã chọn. Để tránh điều này, chỉ cần sử dụng một tên khác khi đặt tên cho tài sản nắm giữ danh sách các mục.

Một số mã tôi sẽ sử dụng nếu tôi là bạn để tránh vấn đề này và viết mã MVC tốt hơn:

Chế độ xem:

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

   // Other properties you need in your view
}

Bộ điều khiển:

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

   return View(model);
}

Trong Chế độ xem của bạn:

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

42
Đã lưu ngày của tôi: "... có một lỗi nhỏ khi thuộc tính ViewBag của bạn nơi bạn đang giữ SelectList trùng với tên của thuộc tính nơi bạn đặt giá trị đã chọn. Để tránh điều này, chỉ cần sử dụng tên khác khi đặt tên cho thuộc tính đang nắm giữ danh sách các mục. " Cảm ơn bạn!
Michael A. Volz hay còn gọi là Flynn

4
"Lỗi nhỏ" này là tuyệt đối điên rồ! Chỉ lãng phí 2 giờ của cuộc đời tôi vì điều này. Làm thế nào mà một thứ quá rõ ràng vẫn tồn tại và không bị vá?
cen

1
Flynn, bình luận của bạn thực sự phải là một câu trả lời. Tôi đã thử các cách triển khai điên rồ để danh sách thả xuống của mình hoạt động và đây là giải pháp đơn giản
Dwayne Hinterlang

2
có một lỗi nhỏ ? Nó không phải là một lỗi ở tất cả. Liên kết mô hình hoạt động bằng cách liên kết với giá trị của một thuộc tính và khi bạn liên kết với OrderTemplatesnỗ lực của mình để liên kết với một thuộc ViewBagtính là typeof IEnumerabe<SelectListItem>. Nhưng một <select>phần tử không thể liên kết với một tập hợp các đối tượng phức tạp (chỉ một loại giá trị)

Trời ơi, tôi sẽ lãng phí cả ngày nếu không có câu trả lời này. Nghiêm túc mà Little BUG là lý do tại sao chúng ta nên cứu trên viewbag
Worthy7

22

Đối với tôi đã không hoạt động nên đã làm việc theo cách này:

Bộ điều khiển:

int selectedId = 1;

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

Lượt xem:

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

JQuery:

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

2
Bộ điều khiển của bạn có số lượng dấu ngoặc đơn không đúng: Nó có một dấu ngoặc đơn mở và hai dấu ngoặc đơn đóng.
Amos Long

Logic jQuery phù hợp với tôi. Cảm ơn bạn.
Shashank

7

Khi bạn truyền một đối tượng như thế này:

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

bạn đang nói: Nguồn ( Model) và Khóa ( "Code") Văn bản ( "Name") và giá trị đã chọn 0. Bạn có thể không có 0giá trị trong nguồn thuộc tính của mình Code, vì vậy, Trình trợ giúp HTML sẽ chọn phần tử đầu tiên để chuyển Giá trị được chọn thực cho điều khiển này.


3

Đảm bảo rằng bạn đã cắt bớt giá trị đã chọn trước khi chỉ định.

//Mô hình

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

// Bộ điều khiển

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;

//Lượt xem

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

2

Nếu bạn biết những gì sẽ có trong chế độ xem, bạn cũng có thể đặt giá trị mặc định từ Bộ điều khiển sau đó thiết lập nó vào tệp view / cshtml. Không cần đặt giá trị mặc định từ phía HTML.

Trong tệp Bộ điều khiển.

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

Trong tệp .cshtml.

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

1

Bạn nên quên lớp học

SelectList

Sử dụng cái này trong Bộ điều khiển của bạn :

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

Chọn giá trị:

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

Thêm danh sách vào ViewData:

ViewBag.CustomerTypes = customerTypes;

Sử dụng cái này trong Chế độ xem của bạn :

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

-

Thông tin thêm tại: http://www.asp.net/mvc/overview/older-versions/working-with-the-dropdownlist-box-and-jquery/using-the-dropdownlist-helper-with-aspnet-mvc


0

Thêm phần điều khiển

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

Thêm phần Html

   @Html.DropDownList("Orders", null)

Một phương pháp đơn giản


Một chế biến dễ dàng thay thế giao dịch
ozboluk ibrahim

0

Đối với tôi giải pháp chung :)

@{
     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 đến Dropdown với mục trống, mục đã chọn (hoạt động 100%)
(Được gõ mạnh, có khả năng xảy ra lỗi tối thiểu) Mọi thay đổi về kiểu máy sẽ được phản ánh trong ràng buộc

Bộ điều khiển

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

        return View(sur);
    }

Lượt xem

        @{


    //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)

Phương pháp này cho dữ liệu ràng buộc cũng có thể

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

Tôi biết đây không thực sự là câu trả lời cho câu hỏi, nhưng tôi đang tìm cách khởi tạo DropDownList từ một danh sách trong chế độ xem khi tôi tiếp tục tình cờ thấy bài đăng này.

Sai lầm của tôi là tôi đã cố tạo Danh sách Chọn từ từ điển như thế này:

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

Sau đó, tôi đã tìm hiểu trong tài liệu msdn chính thức và thấy rằng điều DropDownListForđó không nhất thiết phải yêu cầu SelectList, mà là 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" })

Trong trường hợp của tôi, tôi có thể cũng có thể bỏ qua mục Model.Localitynhư đã chọn, vì a) mục duy nhất và b) nó đã nói nó trong thuộc SelectListItem.Selectedtính.

Chỉ trong trường hợp bạn đang thắc mắc, nguồn dữ liệu là một trang AJAX, được tải động bằng cách sử dụng điều khiển SelectWoo / Select2.


0
public byte UserType
public string SelectUserType

Bạn cần lấy một cái và đặt cái khác. Giá trị đã chọn không được giống với mục mà bạn sắp đặt.

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

Tôi sử dụng từ điển Enum cho danh sách của mình, đó là lý do tại sao có cặp "khóa", "giá trị".


0

Tôi đã gặp sự cố tương tự, tôi đang sử dụng ViewBag và tên Phần tử giống nhau. (Lôi đanh may)


0

Đây là vấn đề CSS. Tôi không biết tại sao @ Html.DropDownListFor trong Bootstrap 4 lại hoạt động. Chắc chắn đây là vấn đề thiết kế đẳng cấp. Dù sao thì giải pháp cũng là, nếu hộp nhập Dropdown của bạn có CSS ​​Padding: #px, # px; sau đó vô hiệu hóa nó. Hy vọng điều này sẽ hiệu quả.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.