I wanted client-side validation for NotEqual. I started out writing my own and got 90% of the way there, then I got a little stuck. A quick Google revealed an existing Gist – however, the original implementation was only for NotEqual property comparison and I need a value compariosn. So, I forked it and made it work for my needs.
(function ($) {
$.validator.addMethod("notequal", function (value, element, param) {
if (param.indexOf("#") == -1) return value != param;
return value != $(param).val();
}, $.validator.messages.notequal);
$.validator.unobtrusive.adapters.add("notequal", ["field"],
function (options) {
options.rules["notequal"] = options.params.field;
if (options.message) options.messages["notequal"] = options.message;
});
})(jQuery);
FluentValidationModelValidatorProvider.Configure(provider =>
{
provider.Add(typeof(NotEqualValidator),
(metadata, context, description, validator) =>
new NotEqualClientRule(metadata, context, description, validator));
});
@model Test.Models.PersonModel
@using (Html.BeginForm())
{
@Html.TextBoxFor(x => x.First)
@Html.ValidationMessageFor(x => x.First)
@Html.TextBoxFor(x => x.Last)
@Html.ValidationMessageFor(x => x.Last)
<button type="submit">OK</button>
}
[Validator(typeof(PersonValidator))]
public class PersonModel
{
public string First { get; set; }
public string Last { get; set; }
}
public class PersonValidator : AbstractValidator<PersonModel>
{
public PersonValidator()
{
RuleFor(x => x.First).NotEqual(x => x.Last);
}
}
When I look back at it, the whole hash check bit in the js just feels icky, so I think I’d go back and fix it up – probably just check to see if the jQuery selector exists, and if so compare .val() otherwise just compare the value. Whatever, it works for now even if it isn’t perfect…