我正在使用带有Unobtrusive js的ASP.NET MVC并且它运行得很好但是我想为这样的事情设置验证规则:
我有两个值为“是”和“否”的下拉列表。我也有一个文本框。
基于从下拉列表中选择值
“是”我想在服务器端的客户端使用Unobtrusive验证是否输入了文本框值,如果
“否”而不是验证应该工作我的意思是,如果文本框值为空或输入的值是否正常,因为如果dropdownlist值为No,则我不想存储该值,否则验证不应该对该文本框起作用。
请有人帮我解决这个问题。
我已经提到了很多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);
我只是复制粘贴代码而不更改名称所以请忽略这些错误。
答案 0 :(得分:1)
鉴于您呈现如下字段:
public Piece insert(Piece piece) {
final MapSqlParameterSource paramMap = new MapSqlParameterSource();
final KeyHolder generatedKeyHolder = new GeneratedKeyHolder();
String[] keyColumnNames = new String[1];
keyColumnNames[0] = HeraConstantes.OID_PIECE;
String sql = UtilsBatchSql.REQ_INSERT_PIECE;
NamedParameterJdbcTemplate parameterJdbcTemplate = new
NamedParameterJdbcTemplate(getSimpleJdbcTemplate().getJdbcOperations());
paramMap.addValue(HeraConstantes.PCE_NUM_PIECE, piece.getNumeroPiece(), Types.BIGINT);
paramMap.addValue(HeraConstantes.PCE_TYPE_PIECE, piece.getTypePiece(), Types.VARCHAR);
paramMap.addValue(HeraConstantes.PCE_ID_BORD, piece.getIdBordereau(), Types.BIGINT);
paramMap.addValue(HeraConstantes.PCE_EXE_RATTACH, piece.getExerciceRattachement(), Types.INTEGER);
paramMap.addValue(HeraConstantes.PCE_DT_EMIS, piece.getDateEmission(), Types.DATE);
paramMap.addValue(HeraConstantes.BUDGET_OID_FROM_RAR_PIECES, piece.getBudgetCollectiviteOID(), Types.BIGINT);
try
{
parameterJdbcTemplate.update(sql, paramMap, generatedKeyHolder, keyColumnNames);
}
catch (DataAccessException e)
{
log.error(e.getMessage());
throw new GerableException(e.getMessage());
}
piece.setPieceOID(generatedKeyHolder.getKey().longValue());
return piece;}
将模型属性声明为:
@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 _dependancy;
public RequiredIfUniTestIsYes(string dependancy)
{
_dependancy = dependancy;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var countryPropertyInfo = validationContext.ObjectInstance.GetType().GetProperty(_dependancy);
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;
}
}