我一直在使用引导模式来显示来自父页面的创建表单。表单可以正常工作,因为它按照我想要的方式将数据添加到数据库中。它显示 [Required] 注释的错误消息,如果有任何错误,则不允许表单保存数据。
问题在于显示我的自定义验证属性包含的验证消息。我还注意到它没有在我自己的ValidationAttributes中触发IsValid函数。
这就是我的 ValidationAttributes 的样子:
public class FormulaSyntaxValidationAttribute : ValidationAttribute
{
public FormulaSyntaxValidationAttribute()
: base("The given formula is not formatted correctly.")
{
}
public override bool IsValid(object value)
{
return DbManager.ValidateStringIfValidFormula(value.ToString());
}
}
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class FormulaVariableValidationAttribute : ValidationAttribute
{
public FormulaVariableValidationAttribute()
: base("The given formula contains other variables instead of `g` or `G` (Gross Salary).")
{
}
public override bool IsValid(object value)
{
return DbManager.ValidateFormulaVariables(value.ToString());
}
}
虽然这是使用定义属性的模型:
public partial class Formula
{
public int FormulaId { get; set; }
public int DeductionId { get; set; }
[Required]
[FormulaSyntaxValidation]
[FormulaVariableValidation]
[Display(Name = "Formula")]
public string FormulaStatement { get; set; }
[Required]
[Display(Name = "Minimum Value")]
public decimal MinimumValue { get; set; }
[Required]
[Display(Name = "Maximum Value")]
public decimal MaximumValue { get; set; }
public virtual Deduction Deduction { get; set; }
}
我使用在 SO 中也找到的简单 javascript 来显示验证消息。这是它的样子。
(function ($) {
$(document).ready(function () {
$("#addFormulaModal").draggable({
handle: ".modal-header"
});
$('#addFormulaModal').on('shown', function () {
$('#addFormulaModal').removeData("validator");
$('#addFormulaModal').removeData("unobtrusiveValidation");
$.validator.unobtrusive.parse($("#formCreateFormula"));
});
$('#addFormulaModal').on('hidden', function () {
location.reload(true);
})
$('#formCreateFormula').submit(function (event) {
event.preventDefault();
$(this).find('div.control-group').each(function () {
if ($(this).find('span.field-validation-error').length == 0) {
$(this).removeClass('error');
}
});
if (!$(this).valid()) {
$(this).find('div.control-group').each(function () {
if ($(this).find('span.field-validation-error').length > 0) {
$(this).addClass('error');
}
});
}
});
$('#createFormSubmit').each(function () {
$(this).find('div.control-group').each(function () {
if ($(this).find('span.field-validation-error').length > 0) {
$(this).addClass('error');
}
});
});
});
})(jQuery);
var page = function () {
$.validator.setDefaults({
highlight: function (element) {
$(element).closest(".control-group").addClass("error");
},
unhighlight: function (element) {
$(element).closest(".control-group").removeClass("error");
}
});
}();
提前致谢。