C# mvc条件模型验证帮助
我使用的是asp.net MVC 3,在我的模块中有两种付款模式1。电汇和2。贝宝。现在,根据类型1和类型2,属性将保留为必需或其他数据注释!如何做到这一点? 例如: 付款类型有一个单选按钮 如果选择类型1-即电汇,则应验证这些字段-姓名、姓氏、电子邮件、受益人姓名、银行名称、银行编号、ifsc代码等 如果是类型2-即PayPal,则这些字段是必填的-PayPal电子邮件C# mvc条件模型验证帮助,c#,asp.net-mvc,asp.net-mvc-3,C#,Asp.net Mvc,Asp.net Mvc 3,我使用的是asp.net MVC 3,在我的模块中有两种付款模式1。电汇和2。贝宝。现在,根据类型1和类型2,属性将保留为必需或其他数据注释!如何做到这一点? 例如: 付款类型有一个单选按钮 如果选择类型1-即电汇,则应验证这些字段-姓名、姓氏、电子邮件、受益人姓名、银行名称、银行编号、ifsc代码等 如果是类型2-即PayPal,则这些字段是必填的-PayPal电子邮件 这可以通过手动验证来完成,但是有没有一些方法可以用DataAnnotations正确地完成呢?您可以编写一个自定义验证程序属
这可以通过手动验证来完成,但是有没有一些方法可以用DataAnnotations正确地完成呢?您可以编写一个自定义验证程序属性,并用它装饰您的模型:
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class CustomValidationAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
var model = value as MyViewModel;
if (model == null)
{
return false;
}
if (model.WireTransfer == 1)
{
return !string.IsNullOrEmpty(model.FirstName) &&
!string.IsNullOrEmpty(model.LastName);
}
else if (model.WireTransfer == 2)
{
return !string.IsNullOrEmpty(model.PaypalEmail);
}
return false;
}
}
然后在主模型中:
[CustomValidation]
public class MyViewModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
...
}
我使用了来自的方法,效果很好。基本上,他创建了一个RequiredIf数据属性,您可以在其中指定其他属性和值,这些属性和值必须为true,才能使当前字段成为必需字段。Simon Ince的博客文章似乎过时了 无需使用DataAnnotationsModelValidator或进行DataAnnotationsModelValidator注册 您可以使用以下代码:
[AttributeUsage(AttributeTargets.Property, AllowMultiple=false)]
public class RequiredIfAttribute : ValidationAttribute, IClientValidatable {
private const string _defaultErrorMessage = "'{0}' is required when {1} equals {2}.";
public string DependentProperty { get; set; }
public object TargetValue { get; set; }
public RequiredIfAttribute(string dependentProperty, object targetValue):base(_defaultErrorMessage) {
this.DependentProperty = dependentProperty;
this.TargetValue = targetValue;
}
public override string FormatErrorMessage(string name) {
return String.Format(CultureInfo.CurrentCulture, ErrorMessageString, name, DependentProperty, TargetValue);
}
protected override ValidationResult IsValid(object value, ValidationContext context) {
if (context.ObjectInstance != null) {
Type type = context.ObjectInstance.GetType();
PropertyInfo info = type.GetProperty(DependentProperty);
object dependentValue;
if (info != null) {
dependentValue = info.GetValue(context.ObjectInstance, null);
if (object.Equals(dependentValue, TargetValue)) {
if (string.IsNullOrWhiteSpace(Convert.ToString(value))) {
return new ValidationResult(ErrorMessage);
}
}
}
}
return ValidationResult.Success;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) {
ModelClientValidationRule rule = new ModelClientValidationRule();
rule.ErrorMessage = this.FormatErrorMessage(metadata.PropertyName);
rule.ValidationType = "requiredif";
rule.ValidationParameters.Add("depedentproperty", DependentProperty);
rule.ValidationParameters.Add("targetvalue", TargetValue);
yield return rule;
}
}
我已经更新了我的示例以使用MVC3,因此其中一个更为最新
thnx!!但问题是,在这种情况下,客户端验证将不起作用?@bhuvin,不,它将不起作用,但您可以通过实现IClientValidatable使其起作用:@darin已尝试过其他方法,但仍然不起作用working@bhuvin,不工作是不够的。你到底试过什么?到底是什么不起作用?我在之前的评论中链接的博客文章非常清楚,它说明了一个工作示例。还有一本你可以读的书。Thnx Darin!!非常感谢你!!
$.validator.unobtrusive.adapters.add('requiredif', ['depedentproperty', 'targetvalue'], function (options) {
options.rules["required"] = function (element) {
return $('#' + options.params.depedentproperty).val() == options.params.targetvalue
};
if (options.message) {
options.messages["required"] = options.message;
}
$('#' + options.params.depedentproperty).blur(function () {
$('#' + options.element.name).valid();
});
});