Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery ASP.NET MVC列表自定义验证<;字符串>;_Jquery_Asp.net Mvc_Asp.net Mvc 4_Unobtrusive Validation - Fatal编程技术网

Jquery ASP.NET MVC列表自定义验证<;字符串>;

Jquery ASP.NET MVC列表自定义验证<;字符串>;,jquery,asp.net-mvc,asp.net-mvc-4,unobtrusive-validation,Jquery,Asp.net Mvc,Asp.net Mvc 4,Unobtrusive Validation,我使用的是ASP.NETMVC5,在客户端,我希望使用JQuery进行不引人注目的验证 以下是我的模型: public class CompanyModel { public CompanyModel() { Employees = new List<EmployeeModel>(); } public int CompanyId{ get; set; }

我使用的是ASP.NETMVC5,在客户端,我希望使用JQuery进行不引人注目的验证

以下是我的模型:

 public class CompanyModel
    {
        public CompanyModel()
        {
            Employees = new List<EmployeeModel>();              
        }
        public int CompanyId{ get; set; }

        public List<EmployeeModel> Employees { get; set; }        
    }

    public class EmployeeModel
    {
        public EmployeeModel()
        {
            Values = new List<string>();
        }

        public string Id { get; set; }

        public string Name { get; set; }

        [RequiredIf("IsRequired", true, "Atleast one value is required")]
        public List<string> Values { get; set; }

        public bool IsRequired { get; set; }
    }
以下是迄今为止我为GetClientValidationRules方法编写的代码

  public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
            {
                var rule = new ModelClientValidationRule
                {
                    ErrorMessage = ErrorMessage,
                    ValidationType = "requiredif"
                };               

                rule.ValidationParameters["dependentproperty"] = (context as ViewContext).ViewData.TemplateInfo.GetFullHtmlFieldId(DependentProperty);
                rule.ValidationParameters["dependentpropertyvalue"] = DependentPropertyValue.ToString().ToLower();

                yield return rule;            
            }
public IEnumerable GetClientValidationRules(ModelMetadata元数据,ControllerContext上下文)
{
var规则=新ModelClientValidationRule
{
ErrorMessage=ErrorMessage,
ValidationType=“requiredif”
};               
rule.ValidationParameters[“dependentproperty”]=(上下文为ViewContext).ViewData.TemplateInfo.GetFullHtmlFieldDid(dependentproperty);
rule.ValidationParameters[“dependentpropertyvalue”]=dependentpropertyvalue.ToString().ToLower();
收益率-收益率规则;
}
我没有看到在html标记中的值中添加验证html(data val-*)属性。我也不希望他们也来,因为我觉得我错过了什么。如何在html中获取由data val requiredif属性填充的values集合的所有元素

有什么想法吗


仅供参考:html中的dependentpropertyId的填充方式与CompanyModel.Employees\u 0\u对员工[0]是必需的一样。

所需的
验证仅确保属性具有值。在类似于
列表的情况下,这意味着它不是空的。空列表仍然是一个列表,因此它通过了验证。实际上,您使用的是
RequiredIf
,还没有提供该自定义属性的实现,但我假设它依赖于基本
Required
属性,因为我看到的几乎每个实现都是这样


长和短,您要么需要修改<代码> RequiredIf <代码>实现,以考虑列表和其他可枚举属性的内容,或者您需要添加一些手动验证来检查该列表实际上至少有一个项。

没有什么要点,包括<代码> GEcliclieValueTrimeRules()

方法,因为它的目的是将
数据val-*
属性添加到为该属性生成的表单控件中,并且您不为属性
生成输入(如果这样做,绑定将失败)。解决此问题的一种方法是处理表单
.submit()
事件,检查集合中是否至少有一个项具有值,如果没有,则取消提交并显示错误

修改视图以包含验证消息placeholder,并将类名添加到输入以供选择

@for (var index = 0; index < Model.Employees.Count; index++)
{
    ....
    <div class="value-group"> // necessary for relative selectors
        @for (int i = 0; i < Model.employees[index].Values.Count; i++)
        {
            @Html.TextBoxFor(m => m.Employees[index].Values[i], new { @class="value", autocomplete = "false" })
        }
        @Html.ValidationMessageFor(m => m.Employees[index].Values)
   </div>
}
for(var index=0;indexm.Employees[index].Values[i],新的{@class=“value”,autocomplete=“false”}) } @Html.ValidationMessageFor(m=>m.Employees[index].value) }
并包括以下脚本

$('form').submit(function() { // use an id selector if you have added one to the form
    var isValid = true;
    var groups = $('.value-group');
    $.each(groups, function(index, item) {
        var group = $(this);
        var inputs = group.find('.value');
        if (inputs.filter(function () { return $(this).val().length > 0; }).length == 0) {
            isValid = false;
            group.find('span:last').append($('<span></span>').text('At least one value is required')).addClass('field-validation-error').removeClass('field-validation-valid');
        }
    });
    return isValid;
});
$('form')。提交(函数(){//如果已将id选择器添加到表单中,请使用id选择器
var isValid=true;
变量组=$('值组');
$。每个(组、功能(索引、项目){
var组=$(此);
变量输入=group.find('.value');
if(inputs.filter(函数(){return$(this).val().length>0;}).length==0){
isValid=false;
group.find('span:last').append($('').text('至少需要一个值')).addClass('field-validation-error').removeClass('field-validation-valid');
}
});
返回有效;
});

您可能还想添加另一个脚本来处理每个输入的更改事件,以删除相关的错误消息(如果组中的任何输入现在有值)

是的,我检查列表上的计数以确保计数>0,这是服务器端。我无法使客户端正常工作。您无法获取集合属性的jquery客户端验证,因为无法为集合生成表单控件(仅针对集合的属性)。您需要编写自己的客户端脚本才能显示自己的客户端消息。好的,谢谢,我知道了@StephenMuecke那么你是否建议做一些类似于这里被接受的答案所建议的事情呢。或者手动将data val和data val requiredif属性添加到html中,然后编写一个jquery验证适配器?@Sparky()也有同样的问题吗?我不太了解ASP或其不引人注目的插件,但就jquery验证而言,验证一组复选框或单选按钮不需要特殊的方法。请参阅:我也看不到您呈现的HTML,因此我不知道
列表应该是什么。但是,使用jQuery Validate,您只能验证
textarea
select
,以及各种类型的
输入
元素;没有别的了。
@for (var index = 0; index < Model.Employees.Count; index++)
{
    ....
    <div class="value-group"> // necessary for relative selectors
        @for (int i = 0; i < Model.employees[index].Values.Count; i++)
        {
            @Html.TextBoxFor(m => m.Employees[index].Values[i], new { @class="value", autocomplete = "false" })
        }
        @Html.ValidationMessageFor(m => m.Employees[index].Values)
   </div>
}
$('form').submit(function() { // use an id selector if you have added one to the form
    var isValid = true;
    var groups = $('.value-group');
    $.each(groups, function(index, item) {
        var group = $(this);
        var inputs = group.find('.value');
        if (inputs.filter(function () { return $(this).val().length > 0; }).length == 0) {
            isValid = false;
            group.find('span:last').append($('<span></span>').text('At least one value is required')).addClass('field-validation-error').removeClass('field-validation-valid');
        }
    });
    return isValid;
});