字符串 MinLength 和 MaxLength 验证不起作用 (asp.net mvc) [英] String MinLength and MaxLength validation don't work (asp.net mvc)

查看:41
本文介绍了字符串 MinLength 和 MaxLength 验证不起作用 (asp.net mvc)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这门课

使用 System.ComponentModel.DataAnnotations;使用 Argussoft.BI.DAL.Domain.Users;命名空间 Argussoft.BI.DAL.DTOs.UserDTOs{公共类 CreateUserDto{[必需(ErrorMessage = "Введите логин")][MaxLength(User.EmailLength, ErrorMessage = "Максимальная длина логина 40 символов")][RegularExpression(User.NameRegularExpression, ErrorMessage = "Логин может содержать только латинские символы, дефисы, подчеркивания, точки")公共字符串名称 { 获取;放;}[必填(ErrorMessage = "Введите Email")][MaxLength(User.EmailLength, ErrorMessage = "Максимальная длина адреса электронной почты 100 символов")][RegularExpression(User.EmailRegularExpression, ErrorMessage = "Введите корректный адрес электронной почты")]公共虚拟字符串 Email { get;放;}[必填(ErrorMessage = "Введите имя пользователя")][MaxLength(User.FullNameLength, ErrorMessage = "Максимальная длина имени пользователя 100 символов")][RegularExpression(User.NameRegularExpression, ErrorMessage = "Имя пользователя может содержать только латинские символы, дефисы, подчеркивачить)公共虚拟字符串 FullName { get;放;}公共虚拟 int 角色 { 获取;放;}[RegularExpression(User.PhoneRegularExpression, ErrorMessage = "Введите корректный номер телефона")]公共虚拟字符串 Phone { get;放;}公共虚拟 int 状态 { 获取;放;}[必填(ErrorMessage = "Введите пароль")][MinLength(User.PasswordMinLength, ErrorMessage = "Минимальная длина пароля 5 символов")][MaxLength(User.PasswordMaxLength, ErrorMessage = "Максимальная длина пароля 20 символов")][RegularExpression(User.PasswordRegularExpression, ErrorMessage = "Пароль может содержать только латинские символы, дефисы, подчеркивания, точки)"公共虚拟字符串密码{获取;放;}}}

还有这个表格

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

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

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

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

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

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

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

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

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

}

用户类别:

公共类用户:BaseEntity{public const int NameLength = 40;public const int PasswordMinLength = 5;public const int PasswordMaxLength = 20;public const int FullNameLength = 100;公共常量 int EmailLength = 100;public const int PhoneLength = 40;//...}

但我的验证仅适用于 RequiredRegularExpression 而不适用于 MinLengthMaxLength 和在这种情况下,我没有收到任何错误消息.

可能是什么原因?

解决方案

MaxLength 用于实体框架在创建数据库时决定字符串值字段的大小.

来自 MSDN:

<块引用>

指定数组的最大长度或属性中允许的字符串数据.

StringLength 是用于验证用户输入的数据注释.

来自 MSDN:

<块引用>

指定最小值和最大值允许的字符长度在数据字段中.

非定制

使用[字符串长度]

[RegularExpression(@"^.{3,}$", ErrorMessage = "最少需要 3 个字符")][必需(ErrorMessage =必需")][StringLength(30, MinimumLength = 3, ErrorMessage = "Maximum 30 characters")]

<块引用>

30 是最大长度
最小长度 = 3

自定义 StringLengthAttribute 类

公共类 MyStringLengthAttribute : StringLengthAttribute{公共 MyStringLengthAttribute(int maximumLength):基础(最大长度){}公共覆盖 bool IsValid(对象值){字符串 val = Convert.ToString(value);if (val.Length < base.MinimumLength)base.ErrorMessage = "最小长度应为 3";if (val.Length > base.MaximumLength)base.ErrorMessage = "最大长度为 6";返回 base.IsValid(value);}}公共类 MyViewModel{[MyStringLength(6, MinimumLength = 3)]公共字符串 MyProperty { 获取;放;}}

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?

解决方案

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

这篇关于字符串 MinLength 和 MaxLength 验证不起作用 (asp.net mvc)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
C#/.NET最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆