我在ASP.NET MVC 1应用程序中使用DataAnnotations,使用Required和Range属性检查Required字段和数字范围.
我正在寻找在几个输入文本框中验证字符串长度的最佳方法.我看到有一个RegularExpression属性可以完成这项工作,但我想知道是否有更具体的属性来执行此操作?
如果有人能指出我使用DataAnnotations的合适资源,我将非常感激.
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
我可以使用哪种正则表达式来匹配(允许)来自任何语言的任何类型的字母
我需要匹配任何字母,包括任何变音符号(例如á,ü,ñ等),并排除任何类型的符号(数学符号,货币符号,装饰符号,框图字符等)和标点字符.
我正在使用带有.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_\|°¬#\ $%/ \()\¡¿+ {} []:\; @ª^*<> =&]*
这是非常丑陋的,并不涵盖所有场景,但最接近我需要的东西.
我通过继承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) 这是我的带有数据注释的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并重新验证时,我确实得到了验证异常(如预期的那样).我的字符串长度注释没有被强制执行的任何想法?
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上发现任何类似的东西.
我有一些关于自定义模型绑定,模型状态和数据注释的问题.
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
我需要在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)
我究竟做错了什么?
我已经使用这里描述的方法来本地化我的数据注释消息,基本上它在正常形式的帖子中工作正常.我也可以在客户端看到本地化的验证消息.
但是,当我有一个部分视图具有要验证的输入字段并使用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
一直试图将服务器端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)
所以基本上,我的问题是:
data-annotations ×10
asp.net-mvc ×6
validation ×6
c# ×2
regex ×2
.net ×1
.net-4.0 ×1
buddy-class ×1
jquery ×1
modelbinders ×1
modelstate ×1
razor ×1
ria ×1
silverlight ×1
unicode ×1