Как заставить атрибут Required для моего пользовательского шаблона редактора DropDownList работать на стороне клиента?

У меня есть шаблон редактора для DropDownLists, который отмечен таким атрибутом:

[AttributeUsage(AttributeTargets.Property)]
public class DropDownListAttribute : UIHintAttribute
{
    public string SelectListName { get; set; }
    public DropDownListAttribute(string selectListName)
        : base("DropDownList", "MVC", selectListName)
    {
        SelectListName = selectListName;
    }
}

А сам выглядит так:

@using Comair.RI.UI.Core
@{
    var list = this.GetModelSelectList();
    var listWithSelected = new SelectList(list.Items, list.DataValueField, list.DataTextField, Model);
}
@Html.DropDownListFor(m => Model, listWithSelected, " - select - ")

Моя проблема здесь заключается в том, что он проверяет только серверную сторону, что очень раздражает пользователя, чтобы разрешить все проверки на стороне клиента, только чтобы отправить и получить новую, неожиданную проверку на стороне сервера.


person ProfK    schedule 15.01.2013    source источник
comment
Не могли бы вы добавить код вашей модели   -  person Sławomir Rosiek    schedule 17.01.2013
comment
@SławomirRosiek Что это должно означать? Это общий вопрос, касающийся любой модели.   -  person ProfK    schedule 17.01.2013
comment
Для меня это работает - у вас были проблемы только с этим элементом управления или, может быть, со всеми клиентскими валидаторами?   -  person Sławomir Rosiek    schedule 17.01.2013


Ответы (2)


Если проверка на стороне клиента не работает, это может быть вызвано одной из следующих причин:

  1. В вашем web.config нет таких записей:

    <appSettings>
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    </appSettings>
    
  2. Вы забыли добавить скрипты проверки:

    <script src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"></script>
    
  3. Ваши элементы управления не окружены Html.BeginForm или Ajax.BeginForm

  4. Проверка на стороне клиента может перестать работать в EditorFor после обновления до ASP.NET MVC 4, если вы используете:

    @Html.DropDownListFor(m => Model, listWithSelected, " - select - ")
    

    Замена Model на m должна решить проблему:

    @Html.DropDownListFor(m => m, listWithSelected, " - select - ")
    
person Sławomir Rosiek    schedule 17.01.2013
comment
Вся моя другая проверка на стороне клиента работает. Моя проблема в том, что только мой шаблон редактора DropDownList не проверяет клиентскую сторону. - person ProfK; 18.01.2013
comment
Я добавил еще одну возможность. - person Sławomir Rosiek; 18.01.2013

Установите необходимый класс

@Html.DropDownListFor(m => Model, listWithSelected, " - select - ", new { @class='required' })

См. ASP MVC 3. : Как выполнить проверку списка выбора на стороне клиента?

person Jeroen K    schedule 18.01.2013
comment
Прекрасно, за исключением того, что сообщение по умолчанию просто Это поле обязательно для заполнения. не Поле {0} является обязательным. Найдите, поместите ли вы сообщения проверки в строку, но не так здорово, если вы сгруппируете их в каком-то «окне» где-нибудь. - person ProfK; 19.01.2013