62

I have this class

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

and this form

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

User class:

public class User : BaseEntity 
{ 
    public const int NameLength = 40; 
    public const int PasswordMinLength = 5; 
    public const int PasswordMaxLength = 20; 
    public const int FullNameLength = 100; 
    public const int EmailLength = 100; 
    public const int PhoneLength = 40; //...
}

but my validation works only for Required and RegularExpression and doesn't work for MinLength and MaxLength and I don't get any error message in this case.

What can be a reason?

Tieson T.
  • 20,774
  • 6
  • 77
  • 92
Heidel
  • 3,174
  • 16
  • 52
  • 84
  • What is the value of User.EmailLength? – PW Kad Aug 16 '13 at 15:25
  • `public class User : BaseEntity { public const int NameLength = 40; public const int PasswordMinLength = 5; public const int PasswordMaxLength = 20; public const int FullNameLength = 100; public const int EmailLength = 100; public const int PhoneLength = 40; //...}` – Heidel Aug 16 '13 at 15:27

5 Answers5

147

MaxLength is used for the Entity Framework to decide how large to make a string value field when it creates the database.

From MSDN:

Specifies the maximum length of array or string data allowed in a property.

StringLength is a data annotation that will be used for validation of user input.

From MSDN:

Specifies the minimum and maximum length of characters that are allowed in a data field.

Non Customized

Use [String Length]

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

30 is the Max Length
Minimum length = 3

Customized StringLengthAttribute Class

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; }
}
Red
  • 3,030
  • 3
  • 22
  • 39
Imad Alazani
  • 6,688
  • 7
  • 36
  • 58
  • How can I set min and max values in this case? – Heidel Aug 16 '13 at 15:30
  • 1
    Thank you, it works. But if I need to set different error messages for MinimumLength and MaximumLength, how can I do that? – Heidel Aug 16 '13 at 15:39
  • 1
    I tried to use your Customized StringLengthAttribute Class, I don't get compilation errors, but it doesn't work again and I don't get any validation error. http://stackoverflow.com/questions/18307385/customized-stringlength-validation-doesnt-work-asp-net-mvc4 What can be wrong? – Heidel Aug 19 '13 at 06:15
  • you can post your model/view controller. – Imad Alazani Aug 19 '13 at 06:21
  • I post my model and view controller here http://stackoverflow.com/questions/18307385/customized-stringlength-validation-doesnt-work-asp-net-mvc4 – Heidel Aug 19 '13 at 06:24
  • directly mention it in view without model check [this](http://stackoverflow.com/a/30013537/2218697) – Shaiju T May 03 '15 at 12:01
  • [RegularExpression(@"^.{5,}$", ErrorMessage = "Minimum 3 characters required")] should be [RegularExpression(@"^.{3,}$", ErrorMessage = "Minimum 3 characters required")] if you want it to validate that its a minimum of 3 chars – Eric Jun 10 '15 at 03:19
9

Try using this attribute, for example for password min length:

[StringLength(100, ErrorMessage = "Максимальная длина пароля 20 символов", MinimumLength = User.PasswordMinLength)]
Daniele
  • 1,938
  • 16
  • 24
  • 1
    If I need to set different error messages for MinimumLength and MaximumLength, how can I do that? – Heidel Aug 16 '13 at 15:43
4
    [StringLength(16, ErrorMessageResourceName= "PasswordMustBeBetweenMinAndMaxCharacters", ErrorMessageResourceType = typeof(Resources.Resource), MinimumLength = 6)]
    [Display(Name = "Password", ResourceType = typeof(Resources.Resource))]
    public string Password { get; set; }

Save resource like this

"ThePasswordMustBeAtLeastCharactersLong" | "The password must be {1} at least {2} characters long"
Ruben.sar
  • 376
  • 3
  • 11
4

This can replace the MaxLength and the MinLength

[StringLength(40, MinimumLength = 10 , ErrorMessage = "Password cannot be longer than 40 characters and less than 10 characters")]
amal50
  • 981
  • 2
  • 21
  • 35
3

They do now, with latest version of MVC (and jquery validate packages). mvc51-release-notes#Unobtrusive

Thanks to this answer for pointing it out!

Community
  • 1
  • 1
Mrchief
  • 75,126
  • 20
  • 142
  • 189