标签: data-annotations

如何使用asp.net mvc中的DataAnnotations验证字符串长度?

我在ASP.NET MVC 1应用程序中使用DataAnnotations,使用Required和Range属性检查Required字段和数字范围.

我正在寻找在几个输入文本框中验证字符串长度的最佳方法.我看到有一个RegularExpression属性可以完成这项工作,但我想知道是否有更具体的属性来执行此操作?

如果有人能指出我使用DataAnnotations的合适资源,我将非常感激.

c# regex validation asp.net-mvc data-annotations

9
推荐指数
1
解决办法
9831
查看次数

当我使用Validator.TryValidateObject时,验证不起作用

DataAnnotations不适用于伙伴类.以下代码始终验证为true.为什么?

var isValid = Validator.TryValidateObject(new Customer(),Context,results,true);

这是好友班.

public partial class Customer 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
}

[MetadataType(typeof(CustomerMetaData))]
public partial class Customer 
{ 
    public class CustomerMetaData 
    { 
        [Required(ErrorMessage = "You must supply a name for a customer.")]        
        public string Name { get; set; } 
    } 
}
Run Code Online (Sandbox Code Playgroud)

这是另一个有相同问题的主题,但没有答案. 链接文字

silverlight asp.net-mvc .net-4.0 buddy-class data-annotations

9
推荐指数
2
解决办法
9082
查看次数

.net Regular Expression可以匹配任何语言的任何类型的字母

我可以使用哪种正则表达式来匹配(允许)来自任何语言的任何类型的字母

我需要匹配任何字母,包括任何变音符号(例如á,ü,ñ等),并排除任何类型的符号(数学符号,货币符号,装饰符号,框图字符等)和标点字符.

我正在使用带有.net 4的asp.net MVC 2.我在我的视图模型中尝试过这个注释:

[RegularExpression(@"\p{L}*", ...
Run Code Online (Sandbox Code Playgroud)

还有这个:

[RegularExpression(@"\p{L}\p{M}*", ...
Run Code Online (Sandbox Code Playgroud)

但客户端验证不起作用.

更新: 感谢您的所有答案,您的建议工作,但仅适用于.net,这里的问题是它还使用正则表达式进行客户端验证与JavaScript(抱歉,如果这还不够清楚).我不得不去:

[!?^ 0-9_\|°¬#\ $%/ \()\¡¿+ {} []:\; @ª^*<> =&]*

这是非常丑陋的,并不涵盖所有场景,但最接近我需要的东西.

.net regex unicode data-annotations asp.net-mvc-2

9
推荐指数
3
解决办法
4325
查看次数

无法在MVC2中设置自定义验证属性的成员名称

我通过继承ValidationAttribute创建了一个自定义验证属性.该属性在类级别应用于我的viewmodel,因为它需要验证多个属性.

我压倒一切

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
Run Code Online (Sandbox Code Playgroud)

并返回:

new ValidationResult("Always Fail", new List<string> { "DateOfBirth" }); 
Run Code Online (Sandbox Code Playgroud)

在所有情况下,DateOfBirth是我的视图模型上的属性之一.

当我运行我的应用程序时,我可以看到它被击中.ModelState.IsValid正确设置为false但是当我检查ModelState内容时,我看到Property DateOfBirth不包含任何错误.相反,我有一个值为null的空字符串Key和一个包含我在验证属性中指定的字符串的异常.

这导致在使用ValidationMessageFor时,我的UI中不显示任何错误消息.如果我使用ValidationSummary,那么我可以看到错误.这是因为它与属性无关.

它看起来好像忽略了我在验证结果中指定了membername的事实.

为什么这样,我该如何解决?

要求的示例代码:

 [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
    public class ExampleValidationAttribute : ValidationAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            // note that I will be doing complex validation of multiple properties when complete so this is why it is a class level attribute
            return new ValidationResult("Always Fail", new List<string> { "DateOfBirth" });
        } …
Run Code Online (Sandbox Code Playgroud)

validation asp.net-mvc data-annotations asp.net-mvc-2

9
推荐指数
2
解决办法
3478
查看次数

StringLengthAttribute似乎不起作用

这是我的带有数据注释的Test类:

class Test
{
  [Required, StringLength(10)]
  public string MyProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是我的控制台测试程序:

class Program
{
  static void Main(string[] args)
  {
    var test = new Test {
      MyProperty = "this is way more than 10 characters and should fail."
    };

    var context = new ValidationContext(test, null, null);

    // No exception here! (why not?)
    Validator.ValidateObject(test, context);

    test.MyProperty = null;

    // Exception here, as expected
    Validator.ValidateObject(test, context);
  }
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,当字符串长度太长时,我没有得到验证异常.当我将属性设置为null并重新验证时,我确实得到了验证异常(如预期的那样).我的字符串长度注释没有被强制执行的任何想法?

validation ria data-annotations

9
推荐指数
1
解决办法
3988
查看次数

如何在MVC3中调用IValidatableObject Validate(ValdationContext)或包含在ModelUpdate中?

来自David Hayden的博客文章:

IValidatableObject并不总是触发

这里有一个问题可能并不明显.如果存在属性级错误,ASP.NET MVC 3中的IValidatableObject将不会触发.正如我所提到的,ASP.NET MVC 3属性验证发生在对象验证之前.如果存在属性错误,ASP.NET MVC 3的设计将不会触发IValidatableObject,以免返回误报(感谢Microsoft的Brad Wilson今天确认这一点).

为了实用性,我想在对象的一个​​集合中获取所有验证消息.

有没有一种简单的方法可以在不破解MVC源的情况下覆盖此默认行为?
我目前正在尝试填充ValidationContext控制器中的对象并调用以下object.Validate()的else块:

if (TryModelUpdate(model))
Run Code Online (Sandbox Code Playgroud)

PS道歉,如果这是重复,我没有在SO上发现任何类似的东西.

validation asp.net-mvc data-annotations asp.net-mvc-3

9
推荐指数
0
解决办法
7116
查看次数

自定义模型绑定,模型状态和数据注释

我有一些关于自定义模型绑定,模型状态和数据注释的问题.

1)如果我的模型上有数据注释,那么在自定义模型绑定器中进行验证是否是多余的,因为这就是我认为数据注释的重点.

2)为什么我的控制器将模型状态视为有效,即使它不是,主要是我使Name属性为null或太短.

3)将自定义模型绑定器视为构造方法是否可以,因为这是他们提醒我的.

首先是我的模型.

public class Projects
{     
    [Key]
    [Required]
    public Guid ProjectGuid { get; set; }

    [Required]
    public string AccountName { get; set; }

    [Required(ErrorMessage = "Project name required")]
    [StringLength(128, ErrorMessage = "Project name cannot exceed 128 characters")]
    [MinLength(3, ErrorMessage = "Project name must be at least 3 characters")]
    public string Name { get; set; }

    [Required]
    public long TotalTime { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后我使用自定义模型绑定器来绑定模型的某些属性.请不要介意它只是试图让它运行然后重构它是快速和肮脏的.

public class ProjectModelBinder : IModelBinder
{
     public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) …
Run Code Online (Sandbox Code Playgroud)

validation asp.net-mvc modelbinders modelstate data-annotations

9
推荐指数
1
解决办法
1万
查看次数

使用CheckBoxFor检查是否需要复选框

我需要在MVC3页面上有一个复选框(用于同意条款).

这是我的模型:

[Required]
[Display("I agree to the terms.")]
public bool Agreement { get; set; }
Run Code Online (Sandbox Code Playgroud)

这是我的观点:

@Html.CheckBoxFor(m => m.Agreement)
Run Code Online (Sandbox Code Playgroud)

但是,验证没有发生 - 它允许无论如何都提交表单.

我发现CheckBoxFor渲染了一个额外的隐藏字段,但我甚至尝试渲染我自己的复选框,但它仍然没有得到验证:

<input type="checkbox" name="Agreement" id="Agreement" value="true" data-val="true"
    data-val-required="You must agree to the terms before proceeding." />
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

asp.net-mvc data-annotations razor

9
推荐指数
0
解决办法
9595
查看次数

jQuery不显眼的验证忽略了MVC3中的data-val-required消息

我已经使用这里描述的方法来本地化我的数据注释消息,基本上它在正常形式的帖子中工作正常.我也可以在客户端看到本地化的验证消息.

但是,当我有一个部分视图具有要验证的输入字段并使用ajax调用加载时,会出现问题.出于某种原因,我得到了默认验证消息("此字段是必需的")而不是我在元素的data-val-required属性中设置的本地化消息.

我已经验证了以下内容:
1.我已经包含了"jquery.validate.min.js"和"jquery.validate.unobtrusive.min.js".
2.我检查了ajax响应,它确实包含带有本地化消息的data-val-required属性.

我已经尝试以下解决方案:
1.我试图解析Ajax响应(没有工作)为.validator.unobtrusive.parse $("形式")
所描述的验证2.解析动态内容在这里.仍然没有解决方案

我有一个迫切的截止日期,这让我很烦恼.

jquery data-annotations unobtrusive-validation asp.net-mvc-3

9
推荐指数
1
解决办法
1万
查看次数

返回多个ValidationExceptions

一直试图将服务器端DataAnnotation验证合并到我的项目中,我发现DataAnnotations有自己的错误类型ValidationException.但是,我的问题在于,它一次只返回一个验证错误,所以如果3个属性验证失败,则只抛出第一个.我正在寻找一种方法将所有错误作为异常抛出,因此它不会通知用户/开发人员验证失败,而是会一次性说明哪些属性/字段验证失败.

我找到了Validator.TryValidateObject(...)方法,但它只是填充ValidationResults并让开发人员选择是否抛出异常.我目前正在实现的是迭代ValidationResults以从中创建ValidationExceptions列表,将列表包装到AggregateException中,然后在其InnerExceptions中抛出另一个带有AggregateException的ValidationException.

ValidationContext validationContext = new ValidationContext(entity, null, null);
List<ValidationResult> validationResults = new List<ValidationResult>();

bool isValid = Validator.TryValidateObject(entity, validationContext, validationResults, true);

if (!isValid)
{
      List<ValidationException> validationErrors = new List<ValidationException>();
      foreach (ValidationResult validationResult in validationResults)
      {    
           validationErrors.Add(new ValidationException(validationResult.ErrorMessage);
      }

      throw new ValidationException("Entity validation failed.", new AggregateException(validationErrors));
}
Run Code Online (Sandbox Code Playgroud)

所以基本上,我的问题是:

  1. 有没有理由为什么没有内置方法同时抛出多个错误?也就是说,我错过了一些DataAnnotation Validations的最佳实践?
  2. 有没有更好的方法来实现我想要实现的目标?
  3. 另外......在将ValidationResult包装到ValidationException中时,如何包含成员名称?

c# validation error-handling data-annotations

9
推荐指数
1
解决办法
2911
查看次数