标签: validationattribute

如何在客户端将自定义ValidationAttribute呈现为"da​​ta-val-xx"属性?

给定一个如下所示的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实现这一目标?

例如,我是否需要在自定义验证器上添加一些特殊属性?或者在某处注册?

validationattribute unobtrusive-validation asp.net-mvc-3

7
推荐指数
1
解决办法
6707
查看次数

如何手动调用ValidationAttributes?(DataAnnotations和ModelState)

我们需要在一些逻辑中迭代模型的属性以自动绑定属性,并希望扩展功能以在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

6
推荐指数
1
解决办法
4692
查看次数

如何使用各个属性中的所有验证属性序列化模型?

上下文:使用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

6
推荐指数
1
解决办法
2183
查看次数

阻止在模型中继承验证属性

我正在使用其他自定义联系模型类继承的基本联系模型.

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-mvc inheritance validationattribute

6
推荐指数
1
解决办法
2243
查看次数

如何本地化 ASP.NET Core 中验证属性的标准错误消息

如何本地化 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

6
推荐指数
1
解决办法
3944
查看次数

GetClientValidationRules 从未在 MVC 应用程序中调用

我有一个实现 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)

asp.net asp.net-mvc validationattribute

5
推荐指数
1
解决办法
2212
查看次数

如何使用自定义ValidationAttribute和INotifyDataErrorInfo验证另一个属性时触发对一个属性的验证

直到最近,我还使用了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)

c# validation wpf validationattribute inotifydataerrorinfo

5
推荐指数
1
解决办法
1402
查看次数

客户端验证不支持使用 Unicode 的 ASP.NET MVC 正则表达式验证

我想验证一个给定的字符串,该字符串将用于在服务器中保存具有所需名称的文件。

这要求我使用以下 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

5
推荐指数
1
解决办法
939
查看次数

模型枚举字段的 ASP.NET 自定义 ErrorMessage

我正在开发一个基于 EntityFrameworkCore 并针对 ASP.NET Core 2.1 的网站。我想为模型中的枚举字段指定错误消息,如下所示:

\n\n
[Required(ErrorMessage = "Select an item from the list.")]\npublic MyEnum MyEnum { get; set; }\n
Run 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受此之苦。

\n\n

我找到了一个解决方法:将字段声明为 int,然后使用自定义验证属性:

\n\n
[EnumCheck(typeof(MyEnum), ErrorMessage = "Select an item form the list.")]\npublic int MyEnum { get; set; }\n
Run Code Online (Sandbox Code Playgroud)\n\n

...然后从 ValidationAttribute 继承子类:

\n\n
sealed 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

5
推荐指数
1
解决办法
3838
查看次数

我需要在 ASP.Net core Web API 的验证属性中返回自定义的验证结果(响应)

我需要在 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# asp.net validationattribute asp.net-web-api asp.net-core

5
推荐指数
1
解决办法
8379
查看次数