Подтвердить что ты не робот

Строка MinLength и проверка MaxLength не работают (asp.net mvc)

У меня этот класс

using System.ComponentModel.DataAnnotations;
using Argussoft.BI.DAL.Domain.Users;

namespace Argussoft.BI.DAL.DTOs.UserDTOs
{
public class CreateUserDto
{
    [Required(ErrorMessage = "Введите логин")]
    [MaxLength(User.EmailLength, ErrorMessage = "Максимальная длина логина 40 символов")]
    [RegularExpression(User.NameRegularExpression, ErrorMessage = "Логин может содержать только латинские символы, дефисы, подчеркивания, точки")]
    public string Name { get; set; }

    [Required(ErrorMessage = "Введите Email")]
    [MaxLength(User.EmailLength, ErrorMessage = "Максимальная длина адреса электронной почты 100 символов")]
    [RegularExpression(User.EmailRegularExpression, ErrorMessage = "Введите корректный адрес электронной почты")]
    public virtual string Email { get; set; }

    [Required(ErrorMessage = "Введите имя пользователя")]
    [MaxLength(User.FullNameLength, ErrorMessage = "Максимальная длина имени пользователя 100 символов")]
    [RegularExpression(User.NameRegularExpression, ErrorMessage = "Имя пользователя может содержать только латинские символы, дефисы, подчеркивания, точки")]
    public virtual string FullName { get; set; }

    public virtual int Role { get; set; }

    [RegularExpression(User.PhoneRegularExpression, ErrorMessage = "Введите корректный номер телефона")]
    public virtual string Phone { get; set; }

    public virtual int Status { get; set; }

    [Required(ErrorMessage = "Введите пароль")]
    [MinLength(User.PasswordMinLength, ErrorMessage = "Минимальная длина пароля 5 символов")]
    [MaxLength(User.PasswordMaxLength, ErrorMessage = "Максимальная длина пароля 20 символов")]
    [RegularExpression(User.PasswordRegularExpression, ErrorMessage = "Пароль может содержать только латинские символы, дефисы, подчеркивания, точки")]
    public virtual string Password { get; set; }
}
}

и эта форма

@model Argussoft.BI.DAL.DTOs.UserDTOs.CreateUserDto

@using (Ajax.BeginForm("CreateUser", "User", new AjaxOptions { OnSuccess = "onSuccessCreateUser" }, new { id = "dialog_form", @class = "form-horizontal" }))
{
    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
    <h4>Добавить пользователя</h4>
</div>
<div class="modal-body">

    <!-- Name -->
    <div class="control-group">
        <label class="control-label" for="@Html.NameFor(model => model.Name)">Логин</label>
        <div class="controls">
            <div class="input-prepend">
                @Html.TextBoxFor(model => model.Name, new { @class = "span3", id = "input_name" })
                <br />
                @Html.ValidationMessageFor(model => model.Name)
            </div>
        </div>
    </div>

    <!-- Email -->
    <div class="control-group">
        <label class="control-label" for="@Html.NameFor(model => model.Email)">Email</label>
        <div class="controls">
            <div class="input-prepend">
                @Html.TextBoxFor(model => model.Email, new { @class = "span3", id = "input_email" })
                <br />
                @Html.ValidationMessageFor(model => model.Email)
            </div>
        </div>
    </div>

    <!-- FullName -->
    <div class="control-group">
        <label class="control-label" for="@Html.NameFor(model => model.FullName)">Имя пользователя</label>
        <div class="controls">
            <div class="input-prepend">
                @Html.TextBoxFor(model => model.FullName, new { @class = "span3", id = "input_full_name" })
                <br />
                @Html.ValidationMessageFor(model => model.FullName)
            </div>
        </div>
    </div>

    <!-- Role -->
    <div class="control-group">
        <label class="control-label" for="@Html.NameFor(model => model.Role)">Роль пользователя</label>
        <div class="controls">
            <div class="input-prepend">
                @Html.DropDownList("Role", (SelectList)ViewBag.Roles,new{id ="input_role"})
                <br />
                @Html.ValidationMessageFor(model => model.Role)
            </div>
        </div>
    </div>

    <!-- Phone -->
    <div class="control-group">
        <label class="control-label" for="@Html.NameFor(model => model.Phone)">Контактный телефон</label>
        <div class="controls">
            <div class="input-prepend">
                @Html.TextBoxFor(model => model.Phone, new { @class = "span3", id = "input_phone" })
                <br />
                @Html.ValidationMessageFor(model => model.Phone)
            </div>
        </div>
    </div>

    <!-- Status -->
    <div class="control-group">
        <label class="control-label" for="@Html.NameFor(model => model.Status)">Статус пользователя</label>
        <div class="controls">
            <div class="input-prepend">
                @Html.DropDownList("Status", (SelectList)ViewBag.UserStatuses,new{id ="input_status"})
                <br />
                @Html.ValidationMessageFor(model => model.Status)
            </div>
        </div>
    </div>

    <!-- Password -->
    <div class="control-group">
        <label class="control-label" for="@Html.NameFor(model => model.Password)">Пароль пользователя</label>
        <div class="controls">
            <div class="input-prepend">
                @Html.TextBoxFor(model => model.Password, new { @class = "span3", id = "input_password" })
                <br />
                @Html.ValidationMessageFor(model => model.Password)
            </div>
        </div>
    </div>

</div>
<div class="modal-footer">
    <a href="@Url.Action("UserIndex", "User")" class="btn">Отменить</a>
    <button type="submit" id="save_button" class="btn btn-primary">Сохранить</button>
</div>
}

но моя проверка работает только для Required и RegularExpression и не работает для MinLength и MaxLength, и в этом случае я не получаю сообщение об ошибке.

Что может быть причиной?

4b9b3361

Ответ 1

MaxLength используется для того, чтобы Entity Framework решила, насколько велика возможность создания поля строкового значения, когда оно создает базу данных.

Из MSDN:

Задает максимальную длину массива или строковые данные, разрешенные в свойстве.

StringLength представляет собой аннотацию данных, которая будет использоваться для проверки ввода пользователя.

Из MSDN:

Задает минимальный и максимальный длина разрешенных символов в поле данных.

Нестандартный

Используйте [String Length]

[RegularExpression(@"^.{5,}$", ErrorMessage = "Minimum 3 characters required")]
[Required(ErrorMessage = "Required")]
[StringLength(30, MinimumLength = 3, ErrorMessage = "Invalid")]

30 - максимальная длина - минимальная длина = 3

Индивидуальный класс StringLengthAttribute

public class MyStringLengthAttribute : StringLengthAttribute
{
    public MyStringLengthAttribute(int maximumLength)
        : base(maximumLength)
    {
    }

    public override bool IsValid(object value)
    {
        string val = Convert.ToString(value);
        if (val.Length < base.MinimumLength)
            base.ErrorMessage = "Minimum length should be 3";
        if (val.Length > base.MaximumLength)
            base.ErrorMessage = "Maximum length should be 6";
        return base.IsValid(value);
    }
}

public class MyViewModel
{
    [MyStringLength(6, MinimumLength = 3)]
    public String MyProperty { get; set; }
}

Ответ 2

Попробуйте использовать этот атрибут, например, для минимальной длины пароля:

[StringLength(100, ErrorMessage = "Максимальная длина пароля 20 символов", MinimumLength = User.PasswordMinLength)]

Ответ 3

Это может заменить MaxLength и MinLength

[StringLength(40, MinimumLength = 10 , ErrorMessage = "Password cannot be longer than 40 characters and less than 10 characters")]

Ответ 4

Теперь они работают с последней версией MVC (и пакетов проверки jquery). mvc51-release-notes#Unobtrusive

Благодаря этому answer, указав его!

Ответ 5

    [StringLength(16, ErrorMessageResourceName= "PasswordMustBeBetweenMinAndMaxCharacters", ErrorMessageResourceType = typeof(Resources.Resource), MinimumLength = 6)]
    [Display(Name = "Password", ResourceType = typeof(Resources.Resource))]
    public string Password { get; set; }

Сохранить ресурс, подобный этому

"ThePasswordMustBeAtLeastCharactersLong" | "The password must be {1} at least {2} characters long"