2010-06-22 4 views
0

Html.DropDownListFor(...)을 사용하여 렌더링 된 드롭 다운 목록이있는 양식이 있습니다. 드롭 다운 목록에 해당하는보기 모델 필드에는 [Required(...)] 특성이 첨부되어 있습니다. 내 로컬 컴퓨터에서 제대로 작동하지만 개발 서버에 게시하는 즉시 목록에서 값을 선택해도 드롭 다운 목록에 필요한 오류 메시지가 계속 표시됩니다. 이것은 IE에서만 발생합니다 - Firefox는 정상적으로 제출합니다.IE의 드롭 다운 목록에서 ASP.NET MVC2 유효성 검사가 작동하지 않습니다.

의견이 있으십니까?

관련 코드

보기 :

<ol class="form"> 
    <li> 
     <%= Html.LabelFor(x => x.ContactTitle) %> 
     <%= Html.DropDownListFor(x=>x.ContactTitle, Model.GetTitleOptions()) %> 
     <%= Html.ValidationMessageFor(x => x.ContactTitle) %> 
    </li> 
    <!-- more fields... --> 
</ol> 

보기 모델 :

[Required(ErrorMessage = "Title is required")] 
[DisplayName("Title")] 
public string ContactTitle { get; set; } 

// ... 

public SelectList GetTitleOptions() 
{ 
    return new SelectList(new string[] 
    { 
     "","Dr.", "Mr.", "Ms.", "Mrs.", "Miss" 
    }); 
} 

그것은 내가 손해를보고있어 ... 모든 아주 기본적인 것들입니다.

편집 :이 버그는 IE 8 호환성보기 및 어쩌면 이전 버전으로 제한됩니다. 표준 모드에서 IE 8은 예상대로 작동합니다 ...

답변

2

초크 어리 석음까지.

<select> 
    <option></option> 
    <option>Dr.</option> 
    <option>Mr.</option> 
    <option>Ms.</option> 
    <option>Mrs.</option> 
    <option>Miss</option> 
</select> 

및 (a RequiredAttribute가 드롭 다운리스트에 대응하는 속성에 적용되는) 관련 MVC 확인 기능은 :

Sys.Mvc.RequiredValidator._validateSelectInput = function Sys_Mvc_RequiredValidator$_validateSelectInput(optionElements) { 
    /// <param name="optionElements" type="DOMElementCollection"> 
    /// </param> 
    /// <returns type="Object"></returns> 
    for (var i = 0; i < optionElements.length; i++) { 
     var element = optionElements[i]; 
     if (element.selected) { 
      if (!Sys.Mvc._validationUtil.stringIsNullOrEmpty(element.value)) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 
예에서, 코드는 다음과 같은 출력을 생성

함수가 element.value인지 확인하십시오. 위의 html의 경우 옵션 요소에 값 속성이 없기 때문에 value 속성은 비어 있습니다. 따라서 유효성 검사 함수는 false를 반환하고 오류가 발생합니다. 이것은 IE < 8에서만 발생합니다. 다른 브라우저에서는 기본적으로 값 요소에 아무 것도 지정되지 않은 경우 option 요소의 텍스트를 할당하기 때문입니다.

이 솔루션은 내가 드롭 다운 목록은과 같이 지어진에서 선택 목록 항목을 반환 된 방법을 수정했다 :

이 훨씬 더 예측 가능한 HTML 출력 결과
public IEnumerable<SelectListItem> GetTitleOptions() 
{ 
    return BuildSelectListItems(new string[] 
    { 
     "","Dr.", "Mr.", "Ms.", "Mrs.", "Miss" 
    }); 
} 

private List<SelectListItem> BuildSelectListItems(IEnumerable<string> values) { 
    return (from v in values 
      select new SelectListItem() 
      { 
       Text = v, 
       Value = v 
      }).ToList(); 
} 

:

<select> 
    <option value=""></option> 
    <option value="Dr.">Dr.</option> 
    <option value="Mr.">Mr.</option> 
    <option value="Ms.">Ms.</option> 
    <option value="Mrs.">Mrs.</option> 
    <option value="Miss">Miss</option> 
</select> 

물론 함수가 올바르게 유효성을 검사합니다.

관련 문제