문제

나는 MVC를 처음 접했지만이 모든 것을 살펴보고 모든 문서와 모든 질문과 내가 찾을 수있는 모든 블로그 게시물을 읽었으며, 내가하는 모든 일은 차축 주위를 완전히 포장하는 것입니다.

나는 "생성"액션과보기를 만들려고 노력하고 있습니다. 내 데이터 입력은 비교적 간단하고 공통적입니다. 드롭 다운 목록과 텍스트 상자가 있습니다. 필자의 경우 사용자 연락처 채널을 만들고 드롭 다운 상자는 이메일과 TextMSG 사이를 선택하고 텍스트 상자는 관련 연락처 정보 (잘 구성된 이메일 주소 또는 휴대폰 번호를 입력합니다.

다음은 내보기 페이지의 (약간 단순화 된 형태)입니다.

 <tr>
     <td><%= Html.DropDownList("ChannelDescription", Model.ChannelDescription, "Select a Channel", new { id = "ChannelDDL", onchange="ChannelDDLChanged()" })%>
         <br />
         <%= Html.ValidationMessage("ChannelDescription", "Please Select a Channel") %>
      </td>
      <td>
           <%= Html.TextBox("SubscriberNotificationAddr") %> <br />
           <%= Html.ValidationMessage("SubscriberNotificationAddr", "Please enter a contact address or number") %>
       </td>
  </tr>

ViewDatadictionary를 사용하지 않고 강력하게 입력 한 ViewData 모델을 사용하고 있습니다. ChannelDescription 요소는 선택 목록이며 선택 목록으로 초기화되고 선택 사항이 없습니다.

양식의 초기 표시, 양식으로의 데이터 입력 및 컨트롤러에 의한 양식에서 데이터를 추출하는 것은 정상입니다.

내 문제는 데이터에 Mal-Formed 이메일 주소 또는 휴대 전화 번호와 같은 오류가 포함되어 있고보기로 돌아 가야한다면 드롭 다운 목록 선택을 다시 실행하는 데 성공하지 못했습니다. ChannelDescription 요소는 사용자가 선택한 항목으로 선택한 컨트롤러에서 재현됩니다. 뷰의 해당 라인에 중단 점을 설정하고 항목 목록의 선택한 요소가 선택된 속성을 true로 설정했는지 확인했지만 여전히 기본 "채널 선택"을 표시합니다.

이것은 매우 일반적인 상황이 될 것 같고, 이렇게 어렵지 않아야합니다. 내가 뭘 잘못하고 있죠?

참고로, 이것은 Firefox 3.5.2에서 MVC 1.0 (릴리스), Windows 7 및 vs 2008을 사용합니다.

도움이 되었습니까?

해결책 2

나는 MVC 팀의 Brad Wilson과 논의를 가졌으며, 그는 DropdownList 헬퍼 방법을 어떻게 사용해야하는지 오해하고 있다고 설명했다 (내가 읽은 내용에서 상당히 일반적이라고 생각한다는 오해).

기본적으로, 뷰 모드의 이름의 이름의 매개 변수에서 SelectList를 제공하고, 선택한 항목을 사용하여 Drop Down 목록을 작성하거나 별도의 매개 변수로 SelectList를 제공하고 ViewModel의 명명 된 매개 변수가 JURTE를 제공하십시오. 선택한 항목의 값 문자열. SelectList 매개 변수를 제공하면 이름이 지정된 값이 SelectList가 아닌 문자열 또는 문자열 목록이 될 것으로 기대합니다.

따라서 이제 ViewModel은보기에 하나의 개념 항목에 대한 두 개의 요소가 있습니다 (드롭 다운 목록). 따라서 모델이있을 수 있습니다

string SelectedValue {get; set;}
SelectList DropDownElements { get; set;}

그런 다음 선택과 함께 DropdownElements를 사전에 인구 할 수 있지만 모델보기 바인딩에서 SelectedValue 요소를 처리하면됩니다. 내가 그렇게 할 때 그것은 나에게 잘 작동하는 것 같습니다.

다른 팁

위의 답변을 본 후, 내가 본 모든 예제는 실제로 강력하게 입력 된 ViewDatamodel이 아닌 ViewDatadictionary를 사용했기 때문에 확인하고 싶었습니다.

그래서 나는 몇 가지 실험을했습니다. 나는 평범한 견해를 사용한 매우 간단한 견해를 만들고 명명 된 키로 값을 전달했습니다. 선택한 항목은 잘 지속되었습니다. 그런 다음 그 뷰 (및 컨트롤러)를 다른 뷰 (컨트롤러)로 자르고 붙여 넣어 강력하게 입력 된 ViewData 모델로 전환하는 데 필요한 것만 변경했습니다. Lo, 보라, 그것은 또한 선택한 항목을 지속시켰다.

그래서 간단한 테스트와 응용 프로그램의 다른 점은 무엇입니까? 내 테스트에서 나는 간단히 "html.dropdownlist ("name ","optionlabel ")"를 사용했습니다. 그러나 응용 프로그램에서 HTML 속성을 추가해야했으며 HTMLATTributes가 포함 된 유일한 과부하에는 선택 목록도 포함되어 있습니다.

Select List 매개 변수가있는 DropdownList Overload가 파산 된 것으로 나타났습니다! 다운로드 된 MVC 소스 코드를 살펴보면 DropdownList가 이름 또는 이름 및 옵션 Label만으로 호출되면 ViewData에서 대상 선택 목록을 검색 한 다음 다음 호출에 의해 개인 SelectIntinal 메서드를 호출합니다.

    return SelectInternal(htmlHelper, optionLabel, name, selectList, true /* usedViewData */, false /* allowMultiple */, (IDictionary<string, object>)null /* htmlAttributes */);

그러나 SelectList 매개 변수로 호출되면 다음으로 끝납니다.

   return SelectInternal(htmlHelper, optionLabel, name, selectList, false /* usedViewData */, false /* allowMultiple */, htmlAttributes);

차이점은 첫 번째 (올바르게 작동)에서 "usedViewData"매개 변수는 참이지만 두 번째는 거짓이라는 것입니다. 실제로는 괜찮지 만 선택적 루틴에서 내부 결함을 노출시킵니다.

usedViewData가 false 인 경우 viewData 모델에서 객체 변수 "defaultValue"가 나타납니다. 그러나 DefaultValue는 실제로 viewData에서 반환되는 것이 SelectList 일 때 문자열 또는 문자열 배열 인 것처럼 사용됩니다. (IEnumerable<SelectListItem>).

usedViewData가 true 인 경우 DefaultValue가 NULL 또는 String이됩니다.

그런 다음 DefaultValue가 NULL이 아닌 경우 다음에 포함 된 코드 블록으로 들어갑니다.

        foreach (SelectListItem item in selectList) {
            item.Selected = (item.Value != null) ? selectedValues.Contains(item.Value) : selectedValues.Contains(item.Text);
            newSelectList.Add(item);

SelectList는 전달 된 원래 SelectList이므로 항목은 selectListItem (문자열 텍스트, 문자열 값 및 bool 선택)입니다. 그러나 SelectedValues는 DefaultValue에서 파생되었으며 문자열 목록이 아닌 SelectList 목록이됩니다. 따라서 각 항목에 대해 선택한 값 목록에 "포함 된"여부에 따라 선택한 플래그를 설정합니다. item.value. 글쎄, selectlists 목록은 문자열을 "포함"하지 않으므로, 선택한 항목은 결코 설정되지 않습니다. (수정 : 실제로, 디버거를 더 많이 추적 한 후, 나는 selectedValues가 defaultValue에서 "toString ()"호출에 의해 파생된다는 것을 알았습니다. 따라서 실제로 문자열 목록이지만 원하는 값을 포함하는 대신 IT입니다. "system.web.mvc.selectlist" - "toString ()"을 선택 목록과 같은 복잡한 객체에 적용한 결과. 결과는 여전히 동일합니다. 우리는 우리가 찾고있는 값을 찾지 못할 것입니다. 목록.)

그런 다음 새로 구성된 "NewsElectList"를 원래 "SelectList"로 대체하고 HTML을 구축합니다.

CAGDAS (귀하의 이름을 정복 한 것에 대해 사과 드리지만 미국 키보드에서 해당 캐릭터를 만드는 방법을 모르겠습니다)가 위에서 말했듯이, DropdownList HtmlHelper 대신에 사용할 방법을 구축해야한다고 생각합니다. 이 릴리스 1과 Release2가 베타 2에 있기 때문에 우리는 스스로를 제대로하지 않으면 버그 수정을 기대할 수 없습니다.

BTW, 지금까지 나를 따랐다면,이 코드는 SRC SystemWebMVC MVC HTML SelectExtensions.cs에 있습니다.

그렇습니다. 저도 제가 제공 한 선택된 항목을 존중하기 위해 드롭 다운 목록을 얻는 데 많은 문제가있었습니다.

확인해주십시오 이 질문에 대한 나의 대답. 내가 기억할 수있는 한, 그것이 내가 일할 수있는 유일한 방법이었습니다. ViewData를 통해 목록을 전달함으로써.

참고로, 나는 그 htmlhelper 방법 사용을 중단했다. 나는 이제 단순히 그것을 출력하고있다 <select> 그리고 <option> 루프로 직접 태그를 지정하고 설정합니다 selected 의 속성 option 직접 확인하여 태그.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top