C# MaxLength属性未生成客户端验证属性

C# MaxLength属性未生成客户端验证属性,c#,asp.net-mvc,validation,asp.net-mvc-3,model-validation,C#,Asp.net Mvc,Validation,Asp.net Mvc 3,Model Validation,我对ASP.NET MVC3客户端验证有一个奇怪的问题。我有以下课程: public class Instrument : BaseObject { public int Id { get; set; } [Required(ErrorMessage = "Name is required.")] [MaxLength(40, ErrorMessage = "Name cannot be longer than 40 characters.")] public

我对ASP.NET MVC3客户端验证有一个奇怪的问题。我有以下课程:

public class Instrument : BaseObject
{
    public int Id { get; set; }

    [Required(ErrorMessage = "Name is required.")]
    [MaxLength(40, ErrorMessage = "Name cannot be longer than 40 characters.")]
    public string Name { get; set; }
}
在我看来:

<div class="editor-field">
    @Html.EditorFor(model => model.Name)
    @Html.ValidationMessageFor(model => model.Name)
</div>

@EditorFor(model=>model.Name)
@Html.ValidationMessageFor(model=>model.Name)
下面是我为该字段的文本框生成的HTML:

<input class="text-box single-line" data-val="true" data-val-required="Name is required." id="Name" name="Name" type="text" value="">

没有任何迹象表明
MaxLengthAttribute
,但其他一切似乎都在运行


有什么问题吗?

尝试使用
[StringLength]
属性:

[Required(ErrorMessage = "Name is required.")]
[StringLength(40, ErrorMessage = "Name cannot be longer than 40 characters.")]
public string Name { get; set; }

这是为了验证目的。例如,如果您想在输入上设置maxlength属性,您可以编写一个自定义数据注释元数据提供程序,并自定义。

我刚才使用了jquery的一个片段来解决这个问题

$("input[data-val-length-max]").each(function (index, element) {
   var length = parseInt($(this).attr("data-val-length-max"));
   $(this).prop("maxlength", length);
});
选择器将查找设置了data val length max属性的所有元素。这是StringLength验证属性将设置的属性

each循环遍历这些匹配项,并将解析出该属性的值,并将其分配给本应设置的mxlength属性


只需将此添加到文档就绪功能中,就可以了。

maxlenghthattribute
自MVC 5.1更新以来一直在工作:

StringLength
工作得很好,我这样使用它:

[StringLength(25,MinimumLength=1,ErrorMessage="Sorry only 25 characters allowed for 
              ProductName")]
public string ProductName { get; set; }
只需使用不带StringLength的
正则表达式

[RegularExpression(@"^[a-zA-Z0-9'@&#.\s]{1,25}$", ErrorMessage = "Reg Says Sorry only 25 
                   characters allowed for ProductName")]    
public string ProductName { get; set; }
但对我来说,上述方法在显示视图中给出了错误,因为我在数据库中已经有超过25个字符的ProductName字段

因此,最后我偶然发现并发布了一篇文章,试图在没有像这样的模型的情况下进行验证:

 <div class="editor-field">
 @Html.TextBoxFor(model => model.ProductName, new
 {
 @class = "form-control",
 data_val = "true",
 data_val_length = "Sorry only 25 characters allowed for ProductName",
 data_val_length_max = "25",
 data_val_length_min = "1"
 })
 <span class="validation"> @Html.ValidationMessageFor(model => model.ProductName)</span>
 </div>

@Html.TextBoxFor(model=>model.ProductName,新建)
{
@class=“表单控制”,
数据_val=“true”,
data\u val\u length=“对不起,ProductName只允许25个字符”,
数据值长度最大值=25“,
数据值长度最小值=“1”
})
@Html.ValidationMessageFor(model=>model.ProductName)
这解决了我的问题,您也可以使用或


希望对某人有所帮助。

我也遇到了同样的问题,通过在视图模型中实现IValidatableObject接口,我能够解决这个问题

public class RegisterViewModel : IValidatableObject
{
    /// <summary>
    /// Error message for Minimum password
    /// </summary>
    public static string PasswordLengthErrorMessage => $"The password must be at least {PasswordMinimumLength} characters";

    /// <summary>
    /// Minimum acceptable password length
    /// </summary>
    public const int PasswordMinimumLength = 8;

    /// <summary>
    /// Gets or sets the password provided by the user.
    /// </summary>
    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    /// <summary>
    /// Only need to validate the minimum length
    /// </summary>
    /// <param name="validationContext">ValidationContext, ignored</param>
    /// <returns>List of validation errors</returns>
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var errorList = new List<ValidationResult>();
        if ((Password?.Length ?? 0 ) < PasswordMinimumLength)
        {
            errorList.Add(new ValidationResult(PasswordLengthErrorMessage, new List<string>() {"Password"}));
        }
        return errorList;
    }
}
公共类RegisterViewModel:IValidatableObject
{
/// 
///最小密码的错误消息
/// 
公共静态字符串PasswordLengthErrorMessage=>$“密码必须至少为{PasswordMinimumLength}个字符”;
/// 
///可接受的最小密码长度
/// 
public const int PasswordMinimumLength=8;
/// 
///获取或设置用户提供的密码。
/// 
[必需]
[数据类型(数据类型.密码)]
[显示(Name=“密码”)]
公共字符串密码{get;set;}
/// 
///只需验证最小长度
/// 
///ValidationContext,已忽略
///验证错误列表
公共IEnumerable验证(ValidationContext ValidationContext)
{
var errorList=新列表();
if((密码?.Length±0)
剃刀中的标记是

<div class="form-group">
    @Html.LabelFor(m => m.Password)
    @Html.PasswordFor(m => m.Password, new { @class = "form-control input-lg" }
    <div class="password-helper">Must contain: 8 characters, 1 upper-case, 1 lower-case
    </div>
    @Html.ValidationMessagesFor(m => m.Password, new { @class = "text-danger" })
</div>

@LabelFor(m=>m.Password)
@Html.PasswordFor(m=>m.Password,新的{@class=“form control input lg”}
必须包含:8个字符,1个大写字母,1个小写字母
@Html.ValidationMessagesFor(m=>m.Password,新的{@class=“text danger”})
这非常有效。如果我尝试使用[StringLength],则呈现的HTML不正确。验证应呈现为:

<span class="text-danger field-validation-invalid field-validation-error" data-valmsg-for="Password" data-valmsg-replace="true"><span id="Password-error" class="">The Password should be a minimum of 8 characters long.</span></span>
密码长度至少应为8个字符。
对于StringLengthAttribute,呈现的HTML显示为一个不正确的ValidationSummary。有趣的是,当验证程序失败时,提交仍然被阻止!

在MVC 4中 如果您想在输入类型文本中输入最大长度?您可以

@Html.TextBoxFor(model => model.Item3.ADR_ZIP, new { @class = "gui-input ui-oblig", @maxlength = "5" })

为@Nick Harrison的回答提供道具:

$("input[data-val-length-max]").each(function (index, element) {
var length = parseInt($(this).attr("data-val-length-max"));
$(this).prop("maxlength", length);
});
我想知道parseInt()的作用是什么?我已经将它简化为这个,没有任何问题

$("input[data-val-length-max]").each(function (index, element) {
    element.setAttribute("maxlength", element.getAttribute("data-val-length-max"))
});

我会对Nicks的答案发表评论,但还没有足够的代表。

这可以替代MaxLength和MinLength

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

我知道我来晚了,但我终于找到了注册
maxlengthattattribute
的方法

首先,我们需要一个验证器:

public class MaxLengthClientValidator : DataAnnotationsModelValidator<MaxLengthAttribute>
{
    private readonly string _errorMessage;
    private readonly int _length;


    public MaxLengthClientValidator(ModelMetadata metadata, ControllerContext context, MaxLengthAttribute attribute)
    : base(metadata, context, attribute)
    {
        _errorMessage = attribute.FormatErrorMessage(metadata.DisplayName);
        _length = attribute.Length;
    }

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = _errorMessage,
            ValidationType = "length"
        };

        rule.ValidationParameters["max"] = _length;
        yield return rule;
    }
}

Et voila,它只是工作。

我在html文档中的所有输入(textarea、inputs等)都尝试了这个方法,这些输入都有data val length max属性,并且工作正常

$(document).ready(function () {
    $(":input[data-val-length-max]").each(function (index, element) {
        var length = parseInt($(this).attr("data-val-length-max"));
        $(this).prop("maxlength", length);
    });
});

$('#Name1')。按键(函数(){
如果(this.value.length>=5)返回false;
});

非常感谢。如果有人想知道,我检查了EF code是否首先使用StringLength属性施加的最大长度创建DB列。:)但这不是答案。因为MinLength属性也不是work@Greg,StringLength属性可以指定最大和最小长度。如果不想指定最大长度,而只指定最小长度,该怎么办?您建议了一种功能性较强的解决方法,但它没有解决验证属性未正确验证的问题。@JeremyHolovacs,如果不想指定最大值,只需将
int.MaxValue
指定为最大长度,然后将属性设置为所需的最小长度。所以,不,这不仅仅是一个功能性的解决办法。它在实践中也能起作用。这非常灵活。您可以使用.data(“val length max”)而不是.attr(“data val length max”):)它现在可以用于验证,但MVC仍然没有将
maxlength
属性应用于
input
元素。这正是@ladengePlease添加说明
$(document).ready(function () {
    $(":input[data-val-length-max]").each(function (index, element) {
        var length = parseInt($(this).attr("data-val-length-max"));
        $(this).prop("maxlength", length);
    });
});
<input class="text-box single-line" data-val="true" data-val-required="Name is required." 
    id="Name1" name="Name" type="text" value="">

$('#Name1').keypress(function () {
    if (this.value.length >= 5) return false;
});