ListBox для не показа ValidationMessageFor, если ни один элемент не выбран - PullRequest
0 голосов
/ 21 января 2019

У меня есть список, как показано ниже:

 @Html.Label("Members", htmlAttributes: new { @class = "control-label required", @multiple = "multiple" })
 @Html.ListBoxFor(model => model.Members, (IEnumerable<SelectListItem>)ViewBag.Members, new { @class = "form-control", @multiple = "multiple" })                                               
 @Html.ValidationMessageFor(model => model.Members, "", new { @class = "text-danger" })

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

    [Required(ErrorMessage = "Please select a member")]
    public List<int> Members { get; set; }

1 Ответ

0 голосов
/ 22 января 2019

Если вы отметите RequiredAttribute в справочном источнике , вы увидите переопределенный метод IsValid, подобный следующему:

public override bool IsValid(object value) 
{
    // checks if the object has null value
    if (value == null) 
    {
        return false;
    }

    // other stuff

    return true;
}

Проблема здесь в том, что IsValid метод проверяет тольконулевые значения и нулевые объекты, но не проверяет свойство Count, которое существует в объектах коллекции, например, IEnumerable<T>.Если вы хотите проверить свойство Count с нулевым значением (что указывает на отсутствие выбранных элементов), вам нужно создать собственный атрибут аннотации, унаследованный от RequiredAttribute, содержащий проверку IEnumerator.MoveNext() и применить его к List<T> свойство:

[AttributeUsage(AttributeTargets.Property)]
public sealed class RequiredListAttribute : RequiredAttribute
{
    public override bool IsValid(object value)
    {
        var list = value as IEnumerable;

        // check against both null and available items inside the list
        return list != null && list.GetEnumerator().MoveNext();
    }
}

// Viewmodel implementation
public class ViewModel
{
    [RequiredList(ErrorMessage = "Please select a member")]
    public List<int> Members { get; set; }
}

Примечание:

Использование int[] типа массива вместо List<int> Например, public int[] Members { get; set; } должно работать для стандартного RequiredAttribute, поскольку массивсвойство возвращает null, когда элементы не выбраны, а свойства List<T> вызывают конструктор по умолчанию, который создаст пустой список.

Связанная проблема:

Обязательный атрибут в универсальном свойстве списка

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