[英]ASP.NET MVC Custom Validation with Unobtrusive
I am using ASP.NET MVC with Unobtrusive js and it's running perfectly fine but I want to set a rule of Validation for something like this: 我正在将ASP.NET MVC与Unobtrusive js结合使用,并且运行得很好,但是我想为以下内容设置验证规则:
I have dropdownlist with two values "Yes" and "No". 我有两个值为“是”和“否”的下拉列表。 I have one textbox as well.
我也有一个文本框。
Based on selection of the values from dropdownlist if 基于从下拉列表中选择的值,如果
"Yes" I want to validate that textbox value entered or not using Unobtrusive at client side with server side as well and if “是”,我想验证是否在客户端和服务器端同时使用Unobtrusive输入了文本框值,以及是否
"No" than no validation should work I mean it's ok if textbox value blank or whatever the values entered because I don't want to store that value if dropdownlist value is No no validation should work on that textbox. “否”而不是验证不起作用我的意思是,如果文本框值为空白或输入的任何值都可以,因为如果dropdownlist值为“否”,我不想存储该值,那么对该文本框不起作用。
Please someone help me out with this problem. 请有人帮我解决这个问题。
I have already refer so many stackoverflow questions and answers it's pretty good answers too there as well but I am not able to put those to get my solution. 我已经提到了很多stackoverflow问题和答案,那里的答案也相当不错,但是我无法将其作为解决方案。
I got the values of dropdown selection in bool ie 我在布尔中得到下拉选择的值,即
public bool IsTestUnit { get; set; }
[RequiredIfUniTestIsYes("IsTestUnit == true", true, ErrorMessage = "Please Enter Test Unit Job Order Number ")]
public long TestUnitJobOrder { get; set; }
The code that I have tried: 我尝试过的代码:
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: 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);
I have just copy paste the code and do not change the name so please ignore those mistake. 我只是复制粘贴代码而未更改名称,因此请忽略这些错误。
Given that you render the fields as below: 假设您渲染字段如下:
@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)
with the model properties declared as: 模型属性声明为:
public bool IsTestUnit { get; set; }
[RequiredIfUniTestIsYes("IsTestUnit", ErrorMessage = "Please Enter Test Unit Job Order Number ")]
public long? TestUnitJobOrder { get; set; }
You can define a custom validator like this: 您可以这样定义自定义验证器:
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;
}
}
And register client-side unobtrusive validation like this: 并注册客户端无干扰的验证,如下所示:
$.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;
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.