Проверка ASP.NET MVC2 не работает с выпадающим списком в IE <8 - PullRequest
0 голосов
/ 23 июня 2010

У меня есть форма с выпадающим списком, отображаемым с использованием Html.DropDownListFor(...). Поле модели представления, соответствующее раскрывающемуся списку, имеет прикрепленный к нему атрибут [Required(...)]. Это прекрасно работает на моем локальном компьютере, но как только я публикуюсь на нашем сервере разработки, в раскрывающихся списках будет отображаться необходимое сообщение об ошибке, даже если в списке выбрано значение. Это происходит только в IE - Firefox отправляет просто отлично.

Есть мысли?

Соответствующий код

Вид:

<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 в стандартном режиме работает как положено ...

1 Ответ

2 голосов
/ 23 июня 2010

Мела это до глупости.Код в этом примере производит вывод, подобный следующему:

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

, что, конечно, функция проверяет правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...