DropDownListFor Not 선택 값


83

편집 페이지 내에서 DropDownListFor 도우미 메서드를 사용하고 있는데 지정한 값을 선택하는 데 운이 없습니다. Stackoverflow 에서 비슷한 질문 을 발견했습니다 . 제안 된 해결 방법은 "보기 코드에서 SelectList 채우기"입니다. 문제는 이미 이것을 시도했지만 여전히 작동하지 않는다는 것입니다.

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

중단 점을 설정하고 model.AddressStateAbbr의 존재 (및 유효성)를 확인했습니다. 내가 무엇을 놓치고 있는지 잘 모르겠습니다.

답변:


184

한 시간 동안 조사한 결과 선택한 항목이로 설정되지 않는 문제를 발견했습니다 DropDownListFor. 그 이유는 모델의 속성과 동일한 ViewBag의 이름을 사용하고 있기 때문입니다.

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

전망

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

선택한 옵션은 드롭 다운 목록으로 설정되지 않지만 ViewBag의 이름을 다른 이름으로 변경하면 선택한 옵션이 올바르게 표시됩니다.

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

전망

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

34
이것은 실제로 정답입니다 !!! 인터넷 검색을하는 모든 사람에게 ViewBag 속성의 이름을 모델 속성과 동일하게 지정하지 마십시오! 나는 이것이 전혀 중요하지 않을 것이라고 예상했지만 실제로는 그것을 고쳤습니다. 놀랐습니다.
Tesserex 2012

10
ViewBag 속성이 모델 속성과 다른 이름을 가지고 있어도 동일한 문제가 있습니다.@Html.DropDownListFor(model => model.Title, (SelectList)ViewBag.Salutation, Resources.Labels.Unknown )
Paul Taylor

8
그들이 똑같을 수없는 이유를 아는 사람이 있습니까? 이 답변 : 분쇄되는 내 노트북을 저장
Jeandre Pentz에게

7
이해가 안 돼요. 이 문제도 발생하고 있으며 ViewBag를 사용하지 않습니다. 또한 문제는 ViewBag를 사용하지 않는 한
조지 마우어

3
나는 이것을 ASP.NET MVC 버그라고 생각합니다!
Néstor Sánchez A.

30

시험:

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

또는 Razor 구문 :

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

식 기반 도우미는 SelectList에서 SelectListItems의 Selected 속성을 존중하지 않는 것 같습니다.


감사! 내 데이터베이스 저장소에서 선택한 값을 가져 오는 빠른 방법이 필요했습니다! Model.AddressStateAbbr은 내가 필요한 부분이었습니다. 단. 다시 한 번 감사드립니다
Tom Stickel 2011 년

30

당신이 제대로 일을하고 모델을 사용하는 경우 - 모든 ViewBag의 괴물과는 달리 - 여전히 문제를보고 때문입니다 @Html.DropDownListFor(m => m.MyValue, @Model.MyOptions)일치하지 않을 수 MyValue는에있는 선택과 함께 MyOptions. 이에 대한 두 가지 잠재적 인 이유는 다음과 같습니다.

  1. MyValuenull입니다. ViewModel에서 설정하지 않았습니다. 하나 만들기 MyOptionsSelected=true이 문제를 해결하지 것이다.
  2. 더 미묘하게도의 유형 은 의 유형MyValue다릅니다 MyOptions. 따라서 if MyValueis (int) 1이지만 MyOptions패딩 된 문자열 목록 인 {"01", "02", "03", ...}경우 분명히 아무것도 선택하지 않을 것입니다.

4
이 답변에 감사드립니다. 나는 또한 모든 사람들이 적절한 뷰 모델을 만드는 대신 ViewBag를 사용하는 이유를 이해하지 못합니다. 이 대답은 저를 쳐다보고 있었고 점을 연결 해주셔서 감사합니다.
Ambiguities

2
# 2는 내 문제입니다. 사용자 지정 모델 바인더가있는 대리자 형식 인 모델 속성이 Method의 이름을 가져오고 실제로 대리자 서명과 일치하는 미리 정의 된 메서드 호출 목록에서 해당 메서드를 바인딩합니다. 누구든지 # 2를 해결하고 일부 해키 클라이언트 측 스크립트없이 올바르게 선택하는 것을 발견 했습니까?
mikeschuld

1
View Models를 사용하는 다른 소식통으로부터 감사드립니다. : D
Vladimir Bozic

1
또한 옵션 태그 사이의 표시 텍스트와 다른 값 속성을 가진 SelectList가있는 모든 사용자에게 제공됩니다 (예 : <option value="2">some text</option>. 실제로 선택한 옵션을 선택하기 위해 값 속성이 아닌 표시 텍스트와보기 모델 속성을 일치 시키려고하는 것 같습니다. 이것은 나를 잠시 동안 가도록했다.
Jason Hanson

17

이 질문을 다루지는 않지만 미래의 Google 사용자가 내 생각 경로를 따를 경우 도움이 될 수 있습니다.

다중 선택을 원했고 DropDownListFor 의이 속성 해킹이 자동 선택되지 않았습니다.

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

대신 모든 것이 작동하도록 만든 ListBoxFor 를 사용해야 했습니다.

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

6
나는 당신의 생각 경로를 따랐습니다. World : DropDownListFor 및 여러 개를 사용하는 경우 ListBoxFor를 사용하는 것입니다.
Scott Stafford

이것은 그것이 작동하는 것을 짜증나게합니다. 내 코드의 다른 위치에서 모든 것이 동일하면 DropDownListFor가 제대로 작동합니다. 나는 이것을 작동시키기 위해 이것을 가지고 노는 데 4-5 시간을 보냈다. 내 마지막 도랑은 이것이었고 효과가있었습니다.
Bryan Hobbs

1

나는 또한 비슷한 문제가 있으며 다음과 같이 해결하고

컨트롤러의 model.States 속성을 선택해야하는 항목으로

model.States = "캘리포니아"

그러면 기본값으로 "California"가 표시됩니다.


0

이 문제는 일반적입니다. viewbag 속성 이름을 페이지에서 사용되는 다른 모델 변수 이름으로 변경하십시오.


0

자신의 코드가 아닌지 확인하는 또 다른 방법은 페이지로드시 값을 변경하는 자바 스크립트 함수가 없는지 확인하는 것입니다. 이 모든 솔루션을 읽은 벽에 머리를 대고 몇 시간 후에 나는 이것이 나에게 일어나고 있음을 발견했습니다.


0

최근에이 문제가 발생했습니다. 그것은 약 한 시간 동안 나를 화나게했습니다. 제 경우 에는 모델 속성과 이름이 같은 변수를 사용 하지 않았습니다ViewBag .

소스 제어 변경 사항을 추적 한 후 문제는 내 작업 에 모델 속성 과 이름이 같은 인수 가 있다는 것이 밝혀졌습니다 .

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

보기에서 :

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

액션의 인수를 다른 이름으로 변경하고 다시 작동하기 시작했습니다.

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

모델의 속성 이름을 변경할 수도 있다고 생각하지만 제 경우에는 인수 이름이 무의미하므로 ...

이 답변이 다른 사람의 문제를 해결하기를 바랍니다.


0

적어도 나에게 문제는 IEnumerable<T>.

기본적으로 발생한 것은 뷰와 모델이 동일한 속성에 대해 동일한 참조를 가지고 있지 않다는 것입니다.

이렇게하면

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

그런 다음

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

View는 CoolNames 속성을 추적하지 못합니다. 간단한 수정은 .ToList()After dooing a projection ( .Select());) 을 추가 하는 것 입니다.


0

나는 같은 문제가 있었다. 아래 예에서 ViewData [ "DATA_ACREDITO_MODELO_INTEGRADO"] 변수에는 기본 선택 값이있는 SelectListItem 목록이 있지만 이러한 속성은 시각적으로 반영되지 않습니다.

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

DropdownList의 첫 번째 인수를 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

나는 이것이 오래된 질문이라는 것을 알고 있지만 2020 년에 같은 문제를 겪고 있습니다.

문제는 모델 속성이 "Title"인 것으로 밝혀졌고 "GivenTitle"로 이름을 변경했으며 이제 예상대로 작동합니다.

에서

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

...에

Html.DropDownListFor(m => m.GivenTitle, Model.GivenTitles, "Please Select", new { @class = "form-control" })
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.