【问题标题】:ASP.NET MVC Custom Validation with Unobtrusive不显眼的 ASP.NET MVC 自定义验证
【发布时间】:2016-11-23 07:21:01
【问题描述】:

我正在使用带有 Unobtrusive js 的 ASP.NET MVC,它运行得非常好,但我想为这样的事情设置一个验证规则:

我有两个值“是”和“否”的下拉列表。我也有一个文本框。

基于从下拉列表中选择的值如果

“是”我想验证输入的文本框值是否在客户端和服务器端使用 Unobtrusive 以及是否

“否”比没有验证应该起作用我的意思是,如果文本框值为空白或输入的任何值都可以,因为如果下拉列表值为“否”,我不想存储该值,该文本框不应进行任何验证。

请有人帮我解决这个问题。

我已经参考了很多 stackoverflow 问题和答案,那里的答案也很不错,但我无法将它们用于获得我的解决方案。

我在 bool 中得到了下拉选择的值,即

 public bool IsTestUnit { get; set; }
    [RequiredIfUniTestIsYes("IsTestUnit == true", true, ErrorMessage = "Please Enter Test Unit Job Order Number ")]
        public long TestUnitJobOrder { get; set; }

我试过的代码:

 public class RequiredIfUniTestIsYes : ValidationAttribute, IClientValidatable
    {
        public RequiredIfUniTestIsYes()
        {

        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            var countryPropertyInfo = validationContext.ObjectInstance.GetType().GetProperty("IsTestUnit");
            var countryValue = countryPropertyInfo.GetValue(validationContext.ObjectInstance, null).ToString();
            if (countryValue == "True" && (value.ToString().Trim() == "" || Convert.ToInt32(value) == 0))
            {
                return new ValidationResult("Please Enter Unit Test Job Order Number");
            }

            return ValidationResult.Success;
        }

        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            var rule = new ModelClientValidationRule();
            rule.ErrorMessage = "Please Enter Unit Test Job Order Number";
            rule.ValidationParameters.Add("istestunit", "true");
            rule.ValidationType = "isunittest";

            yield return rule;
        }
    }

Javascript:

$.validator.addMethod("isunittest", function (state, element, country) {
                 var country = $('#WorkOderDetailViewModel_IsTestUnit').val();
                     if (country == 'True' && state == '') {
                         return false;
                     }
                     return true;
                 });

             $.validator.unobtrusive.adapters.addSingleVal("isunittest", "true");

             (function ($) {
                 $.validator.addMethod('customRequire', function (value, element) {
                     // your validation logic here
                     return true; // true if valid, otherwise false 
                 });
                 $.validator.unobtrusive.adapters.add('customRequire');
             })(jQuery);

我只是复制粘贴代码,并没有更改名称,所以请忽略这些错误。

【问题讨论】:

标签: c# asp.net asp.net-mvc validation unobtrusive-validation


【解决方案1】:

假设您呈现如下字段:

@Html.DropDownListFor(m => m.IsTestUnit,
new[] { true, false }.Select(b => new SelectListItem { Text = b ? "Yes" : "No", Value = b.ToString().ToLower() }),
new { id = "WorkOderDetailViewModel_IsTestUnit" })

@Html.TextBoxFor(m => m.TestUnitJobOrder)
@Html.ValidationMessageFor(m => m.TestUnitJobOrder)

模型属性声明为:

    public bool IsTestUnit { get; set; }

    [RequiredIfUniTestIsYes("IsTestUnit", ErrorMessage = "Please Enter Test Unit Job Order Number ")]
    public long? TestUnitJobOrder { get; set; }

您可以像这样定义自定义验证器:

public class RequiredIfUniTestIsYes : ValidationAttribute, IClientValidatable
{
    private string _dependency;

    public RequiredIfUniTestIsYes(string dependency)
    {
        _dependency = dependency;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var countryPropertyInfo = validationContext.ObjectInstance.GetType().GetProperty(_dependency);
        var countryValue = (bool)countryPropertyInfo.GetValue(validationContext.ObjectInstance, null);
        var number = default(long);
        if (countryValue && (value == null || !long.TryParse(value.ToString(), out number)))
        {
            return new ValidationResult("Please Enter Unit Test Job Order Number");
        }

        return ValidationResult.Success;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule();
        rule.ErrorMessage = "Please Enter Unit Test Job Order Number";
        rule.ValidationParameters.Add("istestunit", "true");
        rule.ValidationType = "isunittest";

        yield return rule;
    }
}

并像这样注册客户端不显眼的验证:

    $.validator.unobtrusive.adapters.add("isunittest", ['istestunit'], function(options){
        options.rules['isunittest'] = options.params;
        options.messages['isunittest'] = options.message;
    });    
    $.validator.addMethod('isunittest', function (state, element, params) {
        var country = $('#WorkOderDetailViewModel_IsTestUnit').val();
        if (country == 'true' && state == '') {
            return false;
        }
        return true;
    });

【讨论】:

  • 在“是”和“否”两种情况下都会出现验证错误。
  • @padhiyar,您的意思是即使您没有输入任何内容并选择了No,验证也会失败?
  • 是的,我只想要验证如果我在选择中选择是,当我选择否时,验证不能触发。
  • 您是否像我的示例中那样渲染下拉列表:@Html.DropDownListFor(m =&gt; m.IsTestUnit, new[] { true, false }.Select(b =&gt; new SelectListItem { Text = b ? "Yes" : "No", Value = b.ToString().ToLower() }), new { id = "WorkOderDetailViewModel_IsTestUnit" }) 和 JS 中的相应条件:if (country == 'true' &amp;&amp; state == '') {
  • 这很奇怪,因为这些代码 sn-ps 已经过测试并且运行良好。
猜你喜欢
  • 1970-01-01
  • 2011-12-06
  • 2012-03-03
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多