给定一个如下所示的ViewModel:
public class Login {
[Required]
public string Username { get; set; }
[Required, CustomValidator]
public string Password { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
像这样的视图(Razor语法在这里):
@Html.TextBoxFor(f => f.Password)
Run Code Online (Sandbox Code Playgroud)
我得到以下标记:
<input type="text"
value=""
data-val-required="This field is required." />
Run Code Online (Sandbox Code Playgroud)
但是我希望它还包含我的自定义验证器的'data-'属性.
我想要这样的东西:
<input type="text"
value=""
data-val-required="This field is required."
data-val-customvalidator="XYZ" />
Run Code Online (Sandbox Code Playgroud)
如何使用ASP.NET MVC 3.0实现这一目标?
例如,我是否需要在自定义验证器上添加一些特殊属性?或者在某处注册?
我们需要在一些逻辑中迭代模型的属性以自动绑定属性,并希望扩展功能以在C#4.0中包含新的数据注释.
目前,我基本上遍历所有ValidationAttribute实例中的每个属性加载并尝试使用Validate/IsValid函数进行验证,但这似乎对我没有用.
作为一个例子,我有一个模型,如:
public class HobbyModel
{
[Required(AllowEmptyStrings = false, ErrorMessage = "Do not allow empty strings")]
[DisplayName("Hobby")]
[DataType(DataType.Text)]
public string Hobby
{
get;
set;
}
}
Run Code Online (Sandbox Code Playgroud)
检查属性的代码是:
object[] attributes = propertyInfo.GetCustomAttributes(true);
TypeConverter typeConverter =
TypeDescriptor.GetConverter(typeof(ValidationAttribute));
bool isValid = false;
foreach (object attr in attributes)
{
ValidationAttribute attrib = attr as ValidationAttribute;
if (attrib != null)
{
attrib.Validate(obj, propertyInfo.Name);
}
}
Run Code Online (Sandbox Code Playgroud)
我调试了代码,模型确实有3个属性,其中2个是从ValidationAttribute派生的,但是当代码通过Validate函数(带有空值或空值)时,它会按预期抛出异常.
我期待我做一些愚蠢的事情,所以我想知道是否有人使用过这个功能并且可以提供帮助.
先谢谢,杰米
asp.net modelstate validationattribute data-annotations asp.net-mvc-3
上下文:使用mvc控制器方法创建jsonP服务,该方法提供包含所有验证规则的表单字段的定义.
我的问题是我不知道如何序列化验证属性.在常规Mvc视图中使用不显眼的验证时,我更喜欢与Razor序列化的格式相同的验证属性.
为了序列化为json,我使用NewtonSoft.Json(4.0.2).
模型示例:public class Profile {
[Required(ErrorMessage="This field is required.")]
[StringLength(25, ErrorMessage="Max 25 chars.")]
public string Firstname{get;set;}
}
Run Code Online (Sandbox Code Playgroud)
首选序列化javascript的示例:
{"Firstname": "John",
"ValidationRules":[{"data-val-required":"This field is required.", "data-val-length-max":25, "data-val-length":"Max 25 chars." }]}
Run Code Online (Sandbox Code Playgroud)
非常感谢任何帮助或指示.
serialization json json.net validationattribute asp.net-mvc-3
我正在使用其他自定义联系模型类继承的基本联系模型.
public class BaseContactModel
{
[Required(ErrorMessage = "Firstname is required")]
public virtual string FirstName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
基本联系人模型使用验证属性来标记属性是必需的,但在某些情况下我想要覆盖或停止它.这有可能吗?
public class ContactModel : BaseContactModel
{
[NotRequired]
public override string FirstName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用新的验证属性NotRequired来返回true,但看起来属性正在堆叠,因此Required和NotRequired正在运行且验证失败.
在寻找解决方案(我找不到)时,我发现一些不相关的属性具有"继承"属性,但我没有在System.ComponentModel.DataAnnotations中的本机验证属性中看到这一点.
这是一个失败的原因吗?我是否需要推出支持禁用继承的自己的版本?任何帮助非常感谢.
如何本地化 ASP.NET Core (v2.2) 中验证属性的标准错误消息?例如,[Required]属性有此错误消息“ The xxx field is required. ”;[EmailAddress]有“ xxx 字段不是有效的电子邮件地址。 ”;【比较】有“ 'xxx'和'yyy'不匹配。 ”等。在我们的项目中,我们不使用英语,我想找到一种方法来翻译标准错误消息,而不直接将它们写入每个数据模型类的每个属性中
c# validationattribute asp.net-core-localization asp.net-core-2.2
我有一个实现 IClientValidatable 的自定义 ValidationAttribute。但是从不调用 GetClientValidationRules 来实际将验证规则输出到客户端。
该属性没有什么特别之处,但由于某种原因,它从未被调用过。我试过在 Application_Start() 中注册一个适配器,但这也不起作用。
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
public class CustomAttribute : ValidationAttribute, IClientValidatable
{
public override bool IsValid(object value)
{
return true;
}
#region IClientValidatable Members
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
string errorMessage = FormatErrorMessage(metadata.GetDisplayName());
yield return new ModelClientValidationRule { ErrorMessage = errorMessage, ValidationType = "custom" };
}
#endregion
}
public class CustomAdapter : DataAnnotationsModelValidator<CustomAttribute>
{
public CustomAdapter(ModelMetadata metadata, ControllerContext context, CustomAttribute attribute)
: base(metadata, context, attribute)
{
}
public override IEnumerable<ModelClientValidationRule> …Run Code Online (Sandbox Code Playgroud) 直到最近,我还使用了IDataErrorInfo接口的自定义扩展版本。我的扩展程序使我可以同时处理多个错误,到目前为止,它为我提供了很好的服务。但是,随着INotifyDataErrorInfo界面的引入,我想我将对其进行试验以查看是否有任何改进。
在阅读了一些在线教程之后,我从中获得了它与各种ValidationAttributes的配合使用System.ComponentModel.DataAnnotations namespace。使用这些,Attribute您可以提供如下基本验证规则:
[MinLength(3, ErrorMessage = "Name must be longer than 3 characters.")]
public string Name
{
get { return name; }
set { name = value; NotifyPropertyChanged("Name"); Validate("Name", name); }
}
Run Code Online (Sandbox Code Playgroud)
最初,它看起来还不错,因为错误消息直接插入Valaidation.Errors了Applied ErrorTemplates中可用的集合中。但是,大多数内置的验证规则实际上都是最基本的,我已经习惯于实现涉及其他属性值的复杂验证规则。
因此,我着手寻找一种创建包含多个属性的简单验证规则的方法:必须设置两个或多个字段之一的规则。因此,我声明了一个扩展的类,ValidationAttribute并在在线搜索后找到了一种访问其他属性值的方法。
我敲了一个基本UI,并ErrorTemplate在每个UI上应用了一个自定义TextBox,它显示Validation.Errors了数据绑定属性的集合:
<ControlTemplate x:Key="ErrorTemplate">
<StackPanel Orientation="Horizontal">
<Border BorderBrush="#4FFF0000" BorderThickness="1" Margin="0,10">
<AdornedElementPlaceholder />
</Border>
<Image Name="WarningImage" Source="pack://application:,,,/WpfApplication1;component/Images/Warning_16.png" Margin="5,0,0,0" Tag="{Binding}" />
<Popup PlacementTarget="{Binding ElementName=WarningImage}" Placement="Right" Margin="5,0,0,0" AllowsTransparency="True" …Run Code Online (Sandbox Code Playgroud) 我想验证一个给定的字符串,该字符串将用于在服务器中保存具有所需名称的文件。
这要求我使用以下 REGEX:^[\p\w\-. ]+$
效果很好,但仅适用于英文字符串。
所以我像这样修改^[\p{L}\w\-. ]+$了{L}修改器设置为接受任何 Unicode 字符。
这是视图模型。
[Required(ErrorMessageResourceType = typeof(FilesRepositoryStrings), ErrorMessageResourceName = "EnterTheNamePlease")]
[Display(ResourceType = typeof(FilesRepositoryStrings), Name = "FileNameInputLabel")]
[RegularExpression(@"^[\p{L}\w\-. ]+$", ErrorMessage = @"The file name can only contain letters, numbers and characters -_.")]
public string FileName { get; set; }
Run Code Online (Sandbox Code Playgroud)
这是 html 渲染
<input class="form-control" data-val="true"
data-val-regex="The file name can only contain letters, numbers and characters -_."
data-val-regex-pattern="^[\p{L}\w\-. ]+$"
data-val-required="??? ?? ??? ?????"
id="UploadFileModel_FileName"
name="UploadFileModel.FileName"
onkeyup="$('#EnterTheNamePlease').attr('hidden', true);"
type="text" value=""
aria-required="true" aria-invalid="true"> …Run Code Online (Sandbox Code Playgroud) regex asp.net-mvc validationattribute unobtrusive-validation
我正在开发一个基于 EntityFrameworkCore 并针对 ASP.NET Core 2.1 的网站。我想为模型中的枚举字段指定错误消息,如下所示:
\n\n[Required(ErrorMessage = "Select an item from the list.")]\npublic MyEnum MyEnum { get; set; }\nRun Code Online (Sandbox Code Playgroud)\n\n但是,仍然生成库存消息:The value \'0\' is invalid。问题似乎是在评估我的任何代码之前验证枚举类型。这里介绍的两种方法(https://www.codeproject.com/Articles/1204077/ASP-NET-Core-MVC-Model-Validation),要么创建一个继承自 ValidationAttribute 的类,要么让模型继承自 IValidatableObject受此之苦。
我找到了一个解决方法:将字段声明为 int,然后使用自定义验证属性:
\n\n[EnumCheck(typeof(MyEnum), ErrorMessage = "Select an item form the list.")]\npublic int MyEnum { get; set; }\nRun Code Online (Sandbox Code Playgroud)\n\n...然后从 ValidationAttribute 继承子类:
\n\nsealed public class EnumCheck : ValidationAttribute\n{\n readonly Type t_;\n\n public EnumCheck(Type t)\n {\n t_ = t;\n }\n\n public override bool IsValid(object …Run Code Online (Sandbox Code Playgroud) c# enums validationattribute ivalidatableobject asp.net-core-2.1
我需要在 ASP.Net core Web API 中返回自定义的验证结果(响应)失效属性,这是我创建的 ValidationAttribute。
class MaxResultsAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
int maxResults = (int)value;
if (maxResults <= 0)
{
return new CustomValidationResult(new ValidationResult("MaxResults should be greater than 0"));
}
return ValidationResult.Success;
}
}
Run Code Online (Sandbox Code Playgroud)
我创建了继承 ValidationResult 的 CustomValidationResult 对象,以便我可以返回我自己的自定义响应:
public class CustomValidationResult : ValidationResult
{
public int FaultCode { get; set; }
public string FaultMessage { get; set; }
public CustomValidationResult(ValidationResult validationResult) : base(validationResult)
{
FaultCode = 123;
FaultMessage = validationResult.ErrorMessage; …Run Code Online (Sandbox Code Playgroud) c# ×4
asp.net ×3
asp.net-mvc ×3
asp.net-core ×1
enums ×1
inheritance ×1
json ×1
json.net ×1
modelstate ×1
regex ×1
validation ×1
wpf ×1