MaxLength属性不生成客户端validation属性

我有一个ASP.NET MVC3客户端validation好奇的问题。 我有以下class级:

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> 

这里是我为这个字段的文本框生成的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; } 

这是为了validation的目的。 如果你想设置例如input的maxlength属性,你可以编写一个自定义数据注释元数据提供程序,如本文所示,并自定义默认模板 。

我只是用jQuery的一个片段来解决这个问题。

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

select器查找所有具有data-val-length-max属性集的元素。 这是StringLengthvalidation属性将设置的属性。

每个循环遍历这些匹配,并将parsing出该属性的值,并将其分配给应该设置的mxlength属性。

只要添加这个文件就绪function,你很好去。

自MVC 5.1更新以来MaxLengthAttribute正在工作: 更改注释

在MVC 4如果你想在inputtypes文本maxlenght? 您可以 !

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

我有这个相同的问题,我能够通过在我的视图模型中实现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; } } 

那么剃刀的标记是…

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

这工作得很好。 如果我尝试使用[StringLength],那么呈现的HTML是不正确的。 validation应该呈现为:

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

使用StringLengthAttribute时,呈现的HTML显示为不正确的ValidationSummary。 有趣的是,当validation失败提交仍然被阻止!

道具@尼克 – 哈里森的回答是:

 $("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")) }); 

我会评论尼克斯的答案,但没有足够的代表呢。

StringLength工程很好,我用这种方式:

 [StringLength(25,MinimumLength=1,ErrorMessage="Sorry only 25 characters allowed for ProductName")] public string ProductName { get; set; } 

只使用RegularExpression而不使用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字段

所以最后我碰到这个和这个post,并试图validation没有这样的模型

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

这解决了我的问题,你也可以使用jquery手动validation或使用ModelState.AddModelError

希望能帮助别人。

这可以代替MaxLength和MinLength

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

我知道我对派对很迟,但是我最终发现我们可以注册MaxLengthAttribute

首先我们需要一个validation器:

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

没什么特别的。 在构造函数中,我们保存属性的一些值。 在GetClientValidationRules我们设置了一个规则。 ValidationType = "length"由框架映射到data-val-lengthrule.ValidationParameters["max"]用于data-val-length-max属性。

既然你有一个validation器,你只需要注册它在global.asax

 protected void Application_Start() { //... //Register Validator DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(MaxLengthAttribute), typeof(MaxLengthClientValidator)); } 

Et瞧,它只是工作。

我试了这个在我的HTML文档(textarea,input等),具有data-val-length-max属性,它工作正常的所有input。

 $(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); }); });