Мела это до глупости.Код в этом примере производит вывод, подобный следующему:
<select>
<option></option>
<option>Dr.</option>
<option>Mr.</option>
<option>Ms.</option>
<option>Mrs.</option>
<option>Miss</option>
</select>
И соответствующая функция проверки MVC (когда RequiredAttribute применяется к свойству, которое соответствует раскрывающемуся списку):
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
является пустым, поскольку в элементах option отсутствует атрибут value.Следовательно, функция проверки возвращает false и возникает ошибка.Похоже, это происходит только в IE <8, предположительно потому, что другие браузеры по умолчанию присваивают текст элемента option атрибуту value, если ни один не указан. </p>
Решением было изменить способ, которым я возвращал элементы списка выбора.из которого выпадающий список был построен следующим образом:
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();
}
Это приводит к гораздо более предсказуемому выводу HTML:
<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>
, что, конечно, функция проверяет правильно.