我一直在使用bootstrap模式从父页面显示创建表单。表单工作正常,因为它以我想要的方式将数据添加到数据库。它显示[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");
}
});
}();
先谢谢。