Asp.net mvc MVC不引人注目的验证-依赖于先前选择的自定义验证程序

Asp.net mvc MVC不引人注目的验证-依赖于先前选择的自定义验证程序,asp.net-mvc,unobtrusive-validation,Asp.net Mvc,Unobtrusive Validation,我有一个带有多个字段的标准地址表。e、 g 地址行1 地址行2 国家 陈述 邮政编码 问题是,只有当“国家”设置为“美国”时,“国家”字段才应为必填字段。如果国家设置为其他任何内容,则不应为必填字段。我可以在控制器中处理它,但我希望在客户端悄悄地处理它。有什么建议吗?请查看MVC万无一失。 您可以将包放入您的解决方案中 它具有这样的属性,可以帮助您 [RequiredIf] [RequiredIfNot] [RequiredIfTrue] [RequiredIfFalse] [Require

我有一个带有多个字段的标准地址表。e、 g

  • 地址行1
  • 地址行2
  • 国家
  • 陈述
  • 邮政编码
问题是,只有当“国家”设置为“美国”时,“国家”字段才应为必填字段。如果国家设置为其他任何内容,则不应为必填字段。我可以在控制器中处理它,但我希望在客户端悄悄地处理它。有什么建议吗?

请查看MVC万无一失。 您可以将包放入您的解决方案中

它具有这样的属性,可以帮助您

[RequiredIf]
[RequiredIfNot]
[RequiredIfTrue]
[RequiredIfFalse]
[RequiredIfEmpty]
[RequiredIfNotEmpty]
[RequiredIfRegExMatch]
[RequiredIfNotRegExMatch]

您需要创建一个自定义验证属性,该属性派生自
ValidationAttribute
。将依赖属性的名称(在本例中为Country)作为构造函数的参数,并重写
IsValid
方法,在该方法中,您将指定使用此依赖属性的验证逻辑

现在,如果您还希望在客户端悄悄地启用此验证,则需要在自定义验证属性中实现
iclientvalidable
接口,然后需要在JavaScript方法中编写相同的验证逻辑。此外,还需要将此方法添加到jQuery非干扰性验证适配器列表中


您可以阅读更多内容。

刚刚为您的需求编写了一个快速演示

// model
public class Address
{
    public int Id { get; set; }
    public string AddressLine1 { get; set; }
    public string AddressLine2 { get; set; }

    [Required]
    public string Country { get; set; }

    [RequiredIfCountryIsUSA]
    public string State { get; set; }
    public string PostCode { get; set; }
}


// Validation Attribute
public class RequiredIfCountryIsUSA : ValidationAttribute, IClientValidatable
{
    public RequiredIfCountryIsUSA()
    {

    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var countryPropertyInfo = validationContext.ObjectInstance.GetType().GetProperty("Country");
        var countryValue = countryPropertyInfo.GetValue(validationContext.ObjectInstance, null).ToString();
        if (countryValue == "USA" && (value == null || string.IsNullOrEmpty(value.ToString().Trim())))
        {
            return new ValidationResult("State is required when Country is USA");
        }

        return ValidationResult.Success;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule();
        rule.ErrorMessage = "State is required when country is USA";
        rule.ValidationParameters.Add("country", "USA");
        rule.ValidationType = "iscountryusa";

        yield return rule;
    }
}

我使用js文件使它变得简单。我创建了一个名为“CountryValidate.Js”的Js文件,编写如下

var list = ["India", "Australia", "Pakisthan"];
 $(document).ready(function(){
        debugger
        $("#Country").keyup(function () {
            debugger
            for (var i = 0; i < list.length; i++) {
                if ($("#Country").val() !== list[i]) {
                    $("#error").show();
                }
                else {
                    $("#error").hide();
                    break;
                }
            }

        });
    });
var list=[“印度”、“澳大利亚”、“巴基斯坦”];
$(文档).ready(函数(){
调试器
$(“#国家”).keyup(函数(){
调试器
对于(变量i=0;i
并在视图中添加了一些语句(Student.cshtml) 我为“国家名称”文本框添加了this属性

<span class="validation has-error text-danger" id="error" hidden>Invalid Country Name</span> 
无效的国家/地区名称

我对文本框所做的更改显示了验证消息

请发送您的查看页面代码您可以实现
IValidatableObject
。例如,请参阅和浏览互联网上的所有内容。
<span class="validation has-error text-danger" id="error" hidden>Invalid Country Name</span>