Jquery ASP.NET MVC列表自定义验证<;字符串>;
我使用的是ASP.NETMVC5,在客户端,我希望使用JQuery进行不引人注目的验证 以下是我的模型: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; }
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;
});