DropDownListFor Không chọn Giá trị


83

Tôi đang sử dụng phương thức trình trợ giúp DropDownListFor bên trong trang chỉnh sửa và tôi không gặp may mắn khi nó chọn giá trị mà tôi chỉ định. Tôi nhận thấy một câu hỏi tương tự trên Stackoverflow. Giải pháp được đề xuất là "điền Danh sách Chọn của bạn vào mã chế độ xem". Vấn đề là tôi đã thử điều này và nó vẫn không hoạt động.

<%= Html.DropDownListFor(model => model.States, new SelectList(Model.States.OrderBy(s => s.StateAbbr), "StateAbbr", "StateName", Model.AddressStateAbbr), "-- Select State --")%>

Tôi đã đặt một điểm ngắt và đã xác minh sự tồn tại (và tính hợp lệ) của model.AddressStateAbbr. Tôi chỉ không chắc mình đang thiếu cái gì.

Câu trả lời:


182

Sau khi nghiên cứu trong một giờ, tôi đã tìm thấy vấn đề khiến cho phần được chọn không được đặt thành DropDownListFor. Lý do là bạn đang sử dụng tên của ViewBag giống với thuộc tính của mô hình.

Thí dụ

public  class employee_insignia
{ 
   public int id{get;set;}
   public string name{get;set;}
   public int insignia{get;set;}//This property will store insignia id
}

// If your ViewBag's name same as your property name 
  ViewBag.Insignia = new SelectList(db.MtInsignia.AsEnumerable(), "id", "description", 1);

Lượt xem

 @Html.DropDownListFor(model => model.insignia, (SelectList)ViewBag.Insignia, "Please select value")

Tùy chọn đã chọn sẽ không được đặt thành danh sách thả xuống, NHƯNG Khi bạn thay đổi tên của ViewBag thành tên khác, tùy chọn đã chọn sẽ hiển thị chính xác.

Thí dụ

ViewBag.InsigniaList = new SelectList(db.MtInsignia.AsEnumerable(), "id", "description", 1);

Lượt xem

 @Html.DropDownListFor(model => model.insignia, (SelectList)ViewBag.InsigniaList , "Please select value")

34
Đây thực sự là một câu trả lời chính xác !!! Đối với mọi người trên googling, hãy đảm bảo rằng bạn không đặt tên thuộc tính ViewBag giống với thuộc tính model! Tôi không mong đợi điều này có vấn đề gì cả, nhưng nó thực sự đã sửa nó. Tôi bị sốc.
Tesserex vào

10
Tôi có cùng một vấn đề, mặc dù thuộc tính ViewBag có một cái tên khác nhau để sở hữu mô hình:@Html.DropDownListFor(model => model.Title, (SelectList)ViewBag.Salutation, Resources.Labels.Unknown )
Paul Taylor

8
Có ai biết lý do tại sao họ không thể giống nhau không? Câu trả lời này lưu máy tính xách tay của tôi bị đập tan :)
Jeandre Pentz

7
Tôi không hiểu. Tôi cũng gặp sự cố này và chúng tôi không sử dụng ViewBag. Cũng là câu hỏi đã không sử dụng ViewBag
George Mauer

3
Tôi coi đây là một lỗi ASP.NET MVC!
Néstor Sánchez A.

30

Thử:

<%= Html.DropDownListFor(
    model => model.AddressStateAbbr,
    new SelectList(
        Model.States.OrderBy(s => s.StateAbbr),
        "StateAbbr",
        "StateName",
        Model.AddressStateAbbr), "-- Select State --")%>

hoặc trong cú pháp Razor:

@Html.DropDownListFor(
    model => model.AddressStateAbbr,
    new SelectList(
        Model.States.OrderBy(s => s.StateAbbr),
        "StateAbbr",
        "StateName",
        Model.AddressStateAbbr), "-- Select State --")

Trình trợ giúp dựa trên biểu thức dường như không tôn trọng thuộc tính Selected của SelectListItems trong SelectList của bạn.


Cảm ơn! Tôi cần một cách nhanh chóng để lấy giá trị đã chọn từ kho cơ sở dữ liệu của mình! Model.AddressStateAbbr là phần tôi cần. Ngọt. Cảm ơn một lần nữa
Tom Stickel

30

Nếu bạn đang thực hiện đúng cách và sử dụng một mô hình - không giống như tất cả những điều kỳ lạ của ViewBag này - mà vẫn thấy vấn đề, thì đó là do @Html.DropDownListFor(m => m.MyValue, @Model.MyOptions)không thể khớp MyValuevới các lựa chọn mà nó có MyOptions. Hai lý do tiềm năng cho điều đó là:

  1. MyValuelà null. Bạn chưa đặt nó trong ViewModel của mình. Làm cho một trong những MyOptionscó một Selected=truesẽ không giải quyết được điều này.
  2. Tinh tế hơn, loại của MyValuelà khác với các loại trong MyOptions. Vì vậy, giống như, nếu MyValue(int) 1, nhưng của bạn MyOptionslà một danh sách các chuỗi được đệm {"01", "02", "03", ...}, nó rõ ràng sẽ không chọn bất cứ thứ gì.

4
Cảm ơn bạn rất nhiều cho câu trả lời này. Tôi cũng không hiểu tại sao mọi người đang sử dụng ViewBag thay vì tạo một mô hình chế độ xem thích hợp. Câu trả lời này đã làm tôi nhìn chằm chằm vào mặt tôi và tôi đánh giá cao bạn đã kết nối các dấu chấm.
mơ hồ

2
# 2 đây là vấn đề của tôi. Tôi có thuộc tính mô hình là kiểu ủy quyền với chất kết dính mô hình tùy chỉnh để lấy tên của Phương thức và thực sự liên kết phương thức đó từ danh sách các lệnh gọi phương thức được xác định trước phù hợp với chữ ký của người đại diện. Có ai đã tìm thấy một là để làm việc xung quanh # 2 và làm cho nó được chọn chính xác mà không có một số tập lệnh phía máy khách hacky?
mikeschuld

1
Cảm ơn từ một người
sành điệu

1
Ngoài ra, để bất cứ ai có một SelectList với một thuộc tính giá trị khác biệt so với các văn bản hiển thị giữa các thẻ tùy chọn ví dụ: <option value="2">some text</option>. Có vẻ như nó đang thực sự cố gắng khớp thuộc tính mô hình chế độ xem với văn bản hiển thị chứ không phải thuộc tính giá trị để chọn tùy chọn đã chọn. Điều này đã có tôi đi trong một thời gian.
Jason Hanson

17

Mặc dù không giải quyết được câu hỏi này - nó có thể giúp ích cho những người dùng google trong tương lai nếu họ đi theo con đường suy nghĩ của tôi:

Tôi muốn có nhiều lựa chọn và bản hack thuộc tính này trên DropDownListFor không tự động chọn

Html.DropDownListFor(m => m.TrainingLevelSelected, Model.TrainingLevelSelectListItems, new {multiple= "multiple" })

thay vào đó, tôi nên sử dụng ListBoxFor để làm cho mọi thứ hoạt động

Html.ListBoxFor(m => m.TrainingLevelSelected, Model.TrainingLevelSelectListItems)

6
Tôi đã đi theo con đường suy nghĩ của bạn. Thế giới: nếu bạn đang sử dụng DropDownListFor và nhiều, bạn có nghĩa là sử dụng ListBoxFor.
Scott Stafford

Điều này thật khó chịu khi nó hoạt động. Ở một nơi khác trong mã của tôi, với mọi thứ giống nhau, DropDownListFor hoạt động tốt. Tôi đã dành bốn hoặc năm giờ chơi với cái này để cố gắng làm cho nó hoạt động. Cái mương cuối cùng của tôi là cái này, và nó đã hoạt động.
Bryan Hobbs

1

Tôi cũng gặp sự cố tương tự và tôi giải quyết nó bằng cách sau, đặt

thuộc tính model.States trên bộ điều khiển của bạn thành những gì bạn cần được chọn

model.States = "California"

và sau đó bạn sẽ nhận được "California" làm giá trị mặc định.


0

vấn đề này là phổ biến. thay đổi tên thuộc tính viewbag thành tên biến mô hình khác được sử dụng trên trang.


0

Một điều khác cần kiểm tra nếu đó không phải là tất cả mã của riêng bạn, đó là đảm bảo rằng không có hàm javascript nào thay đổi giá trị khi tải trang. Sau nhiều giờ đập đầu vào tường đọc qua tất cả các giải pháp này, tôi phát hiện ra đây là những gì đang xảy ra với tôi.


0

Tôi gặp phải vấn đề này gần đây. Nó khiến tôi phát điên trong khoảng một giờ. Trong trường hợp của tôi, tôi đã không sử dụng một ViewBagbiến có cùng tên với thuộc tính mô hình.

Sau khi truy tìm các thay đổi kiểm soát nguồn, vấn đề hóa ra là hành động của tôi có đối số trùng tên với thuộc tính mô hình:

public ActionResult SomeAction(string someName)
{
    var model = new SomeModel();
    model.SomeNames = GetSomeList();
    //Notice how the model property name matches the action name
    model.someName = someName; 
}

Theo quan điểm:

@Html.DropDownListFor(model => model.someName, Model.SomeNames)

Tôi chỉ đơn giản là thay đổi đối số của hành động thành một số tên khác và nó bắt đầu hoạt động trở lại:

public ActionResult SomeAction(string someOtherName)
{
    //....
}

Tôi cho rằng người ta cũng có thể thay đổi tên thuộc tính của mô hình nhưng trong trường hợp của tôi, tên đối số là vô nghĩa vì vậy ...

Hy vọng rằng câu trả lời này sẽ cứu ai đó khỏi rắc rối.


0

Vấn đề ít nhất đối với tôi là gắn liền với IEnumerable<T>.

Về cơ bản những gì đã xảy ra là chế độ xem và mô hình không có cùng tham chiếu cho cùng một thuộc tính.

Nếu bạn làm điều này

IEnumerable<CoolName> CoolNames {get;set;} = GetData().Select(x => new CoolName{...});}

Sau đó, ràng buộc điều này bằng cách sử dụng

@Html.DropDownListFor(model => model.Id, Model.CoolNames)

Chế độ xem mất dấu thuộc tính CoolNames, một cách khắc phục đơn giản là thêm .ToList()Sau khi thực hiện một phép chiếu ( .Select());).


0

Tôi đã từng gặp vấn đề tương tự. Trong ví dụ bên dưới Biến ViewData ["DATA_ACREDITO_MODELO_INTEGRADO"] có danh sách SelectListItem với giá trị được chọn mặc định nhưng thuộc tính này không được phản ánh trực quan.

// data 
        var p_estadoAcreditacion = "NO";
        var estadoAcreditacion = new List<SelectListItem>();
        estadoAcreditacion.Add(new SelectListItem { Text = "(SELECCIONE)"    , Value = " "    });
        estadoAcreditacion.Add(new SelectListItem { Text = "SI"              , Value = "SI"   });
        estadoAcreditacion.Add(new SelectListItem { Text = "NO"              , Value = "NO"   });

        if (!string.IsNullOrEmpty(p_estadoAcreditacion))
        {
            estadoAcreditacion.First(x => x.Value == p_estadoAcreditacion.Trim()).Selected = true;
        }
         ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] = estadoAcreditacion;

Tôi đã giải quyết nó bằng cách tạo đối số đầu tiên của DropdownList, khác với thuộc tính id.

// error:
@Html.DropDownList("SELECT__ACREDITO_MODELO_INTEGRADO"
, ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] as List<SelectListItem>
, new
{
id         = "SELECT__ACREDITO_MODELO_INTEGRADO"
...
// solved :
@Html.DropDownList("DROPDOWNLIST_ACREDITO_MODELO_INTEGRADO"
, ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] as List<SelectListItem>
, new
{
id         = "SELECT__ACREDITO_MODELO_INTEGRADO"

...


0

Tôi biết đây là một câu hỏi cũ nhưng tôi đã gặp vấn đề tương tự vào năm 2020.

Hóa ra vấn đề là với thuộc tính mô hình được gọi là "Title", tôi đã đổi tên nó thành "GivenTitle" và nó hiện hoạt động như mong đợi.

Từ

Html.DropDownListFor(m => m.Title, Model.Titles, "Please Select", new { @class = "form-control" })

đến

Html.DropDownListFor(m => m.GivenTitle, Model.GivenTitles, "Please Select", new { @class = "form-control" })
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.