2013-08-14 4 views
3

올바른 요소를 선택하여 드롭 다운 목록을 만들려면 asp.net 및 면도기 엔진을 가져 오는 데 문제가 있습니다. 내가 시도한 것에 상관없이 사용할 수있는 값 중 하나가 "0"이면 해당 항목이 항상 선택됩니다.항목 값이 0 인 DropDownListFor가 항상 선택됨

작성하려고하는 것은 -2에서 2까지의 등급에 대한 선택입니다. 0은 중간 값이지만 사전에 선택하면 안됩니다. 사용자는 결정을 내려야하므로 기본 값은 비어 있어야합니다.

아래 코드와 같은 옵션 레이블이있는 드롭 다운 목록을 만들면 기본값이 비어 있지 않습니다. 예를 들어 값이 1-5 인 경우이 작업이 가능합니다.

@Html.DropDownListFor(model => model.Rating, new SelectList(new List<SelectListItem>() 
{ 
    new SelectListItem() {Text = "-2", Value = "-2"}, 
    new SelectListItem() {Text = "-1", Value = "-1"}, 
    new SelectListItem() {Text = "0", Value = "0"}, 
    new SelectListItem() {Text = "1", Value = "1"}, 
    new SelectListItem() {Text = "2", Value = "2"} 
}, "Value", "Text"), String.Empty, new { @class = "rating-select" }) 

상기 코드는 0 항목 선택된 태그를 추가하고, 다음과 같은 HTML 작성

<select class="rating-select valid" data-val="true" data-val-number="The field Rating must be a number." data-val-required="Rating is required." id="Rating" name="Rating"> 
    <option value=""></option> 
    <option value="-2">-2</option> 
    <option value="-1">-1</option> 
    <option selected="selected" value="0">0</option> 
    <option value="1">1</option> 
    <option value="2">2</option> 
</select> 

내가 빈 값을 선택하는 모든 버전을 시도했지만, 같은 모든 결과; 선택한 태그로 0 항목이 생성됩니다. 빈 항목 객체를 생성하고 객체를 설정

@Html.DropDownListFor(model => model.Rating, new SelectList(new List<SelectListItem>() 
{ 
    new SelectListItem() {Text = "Null", Value = "", Selected = True}, 
    new SelectListItem() {Text = "-2", Value = "-2"}, 
    new SelectListItem() {Text = "-1", Value = "-1"}, 
    new SelectListItem() {Text = "0", Value = "0"}, 
    new SelectListItem() {Text = "1", Value = "1"}, 
    new SelectListItem() {Text = "2", Value = "2"} 
}, "Value", "Text"), String.Empty, new { @class = "rating-select" }) 

사실 위의 작업

@{SelectListItem blankItem = new SelectListItem() {Text = "Null", Value = ""}} 
@Html.DropDownListFor(model => model.Rating, new SelectList(new List<SelectListItem>() 
{ 
    blankItem, 
    new SelectListItem() {Text = "-2", Value = "-2"}, 
    new SelectListItem() {Text = "-1", Value = "-1"}, 
    new SelectListItem() {Text = "0", Value = "0"}, 
    new SelectListItem() {Text = "1", Value = "1"}, 
    new SelectListItem() {Text = "2", Value = "2"} 
}, "Value", "Text", blankItem), String.Empty, new { @class = "rating-select" }) 

없음 값 중 하나가없는 경우 selectList의 선택 선정 빈 항목을 만들기

= 0.

누군가 적절한 해결책을 알고 있습니까? 아니면 이것이 프레임 워크의 버그일까요?

나는이 해결 방법 해킹으로 해결할 수 있지만, 차라리하지 않는 게 좋을는 ...

답변

5
나는 model.Rating 속성의 유형이 무엇인지 살펴 것

, 나는 가정입니다 그것은 int이며 . 이 유형이 (int)이고 값을 제공하지 않으면 뷰에 도달하면 값이 0에 바인딩됩니다. 따라서보기가 처리 될 때 0이 선택된 것으로 표시됩니다. 즉보기 엔진이 올바른 값이라고 생각하는 값이며 사용자가 수동으로 선택한 선택한 값보다 우선합니다. model.Rating 속성을 nullable int (int?)으로 만들고 동일한 문제가 있는지 확인하십시오.

둘째, 빠른 jQuery 함수를 살펴보면 드롭 다운을 처음 제공된 값으로 재설정 할 수 있지만 원하는 것보다 조금 더 "해킹"될 수 있습니다.

+0

물론 말이됩니다. 두 번째 시도에서 다른 값을 사용하면 모델에서 값을 가져 왔기 때문에 거기에 "0"이 없더라도 선택한 값을 사용하지 않았습니다. 지금은 이해가되지만, 다른 질문이나 정보를 찾는 것이 어려웠습니다. 등급을 null로 지정할 수있게 만들기 int? 이 경우 String.Empty 옵션을 사용하면 문제가 없습니다! 고맙습니다! – Leo

+0

그래, 모델은 항상 수동으로 선택한 값을 무시하고 기본값의 경우 간과하기 쉽습니다. 프로젝트를 효과적으로 운영하는 데 도움이됩니다.* (면책 조항 : 이것이 사실이 아닌 일부 뚜렷한 경우가 있지만, 일반적으로 말하면 유효한 진술) – Tommy

2

용액 Ratingint는 (디폴트 값과 동일 0) 때문에 값 0을 갖는 항목을 방지하거나, 대신 Html.DropDownList DROPDOWNLIST를 이용하여 자신의 바인딩 처리 중입니다. 후자를 선택하는 경우 사용자가 바인딩하는 동안 선택한 항목에 대해 Selected을 지정해야합니다.

+0

예, 감사합니다! 위에서 제안한 것처럼 nullable로 지정하면이 경우 트릭을 수행합니다. – Leo

+0

올바른 방향으로 나를 가리 켰습니다. optionalLabel 매개 변수를 설정하지 않고 DropDownListFor를 사용하면 모델에서 값을 올바르게 선택할 수 있습니다. optionLabel을 설정하면 모델에서 Selected 속성을 먼저 설정하지 않으면 항상 해당 값이 선택됩니다. – Jason

관련 문제