【发布时间】:2017-06-21 07:49:37
【问题描述】:
我正在开发一个 ASP.NET MVC 5.2.3 自定义数据注释,用于在 Visual Studio 2015 中进行验证。它需要采用任意数量的字段并确保如果一个有值,它们都必须有一个值;如果它们都是空/空白,那应该没问题。
一些例子有所帮助:
- ASP.NET MVC implement custom validator use IClientValidatable
- MVC Form Validation on Multiple Fields
- http://www.macaalay.com/2014/02/24/unobtrusive-client-and-server-side-age-validation-in-mvc-using-custom-data-annotations/
但是,我不确定在验证未知数量的字段时如何进行客户端验证。
如何使用IClientValidatable 接口的GetClientValidationRules() 方法的实现将其传递给客户端?
另外,如何将这个新的数据注释应用到我的视图模型上的属性?会是这样吗?
[MultipleRequired("AppNumber", "UserId", /* more fields */), ErrorMessage = "Something..."]
[DisplayName("App #")]
public int AppNumber { get; set; }
[DisplayName("User ID")]
public int UserId { get; set; }
这是我可以通过MultipleRequiredAttribute 自定义数据注释类得到的:
public class MultipleRequiredAttribute : ValidationAttribute, IClientValidatable
{
private readonly string[] _fields;
public MultipleRequiredAttribute(params string[] fields)
{
_fields = fields;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
// If any field has value, then all must have value
var anyHasValue = _fields.Any(f => !string.IsNullOrEmpty(f));
if (!anyHasValue) return null;
foreach (var field in _fields)
{
var property = validationContext.ObjectType.GetProperty(field);
if (property == null)
return new ValidationResult($"Property '{field}' is undefined.");
var fieldValue = property.GetValue(validationContext.ObjectInstance, null);
if (string.IsNullOrEmpty(fieldValue?.ToString()))
return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}
return null;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule
{
ErrorMessage = ErrorMessage,
ValidationType = "multiplerequired"
};
}
}
谢谢。
【问题讨论】:
-
你为 jquery 构建一个自定义函数 Validate js plugin on client
-
从阅读The Complete Guide To Validation In ASP.NET MVC 3 - Part 2开始。在您的
GetClientValidationRules()方法中,您添加一个ModelClientValidationRule,您可以在其中传递一个(比如说)逗号分隔的属性名称列表 - 即您的fields值 - 可以在客户端脚本中解析和使用(如果您的有问题,让我知道,我会添加一个答案,但几个小时内没有机会) -
谢谢,@StephenMuecke!我的问题之一是如何将值传递给客户端。
-
你的问题状态 如果一个有一个值,它们都必须有一个值,但你的代码没有验证这一点(你还需要将该属性应用于所有属性如果是这样)
-
另外,您的
return new ValidationResult($"Property '{field}' is undefined.");也没有任何意义(在视图中显示该消息对用户来说毫无意义且令人困惑) - 要么忽略它,要么在构造函数中签入并抛出异常
标签: c# asp.net asp.net-mvc validation data-annotations