Я пытаюсь внедрить проверку удаленного клиента, чтобы проверить, было ли имя пользователя уже занято. Я прочитал сообщение Фила Хака и статью msdn и пришел к следующей реализации:
public class RemoteAttribute : ValidationAttribute
{
public string Action { get; set; }
public string Controller { get; set; }
public override bool IsValid(object value)
{
return true;
}
}
public class RemoteValidator : DataAnnotationsModelValidator<RemoteAttribute>
{
public RemoteValidator(ModelMetadata metadata, ControllerContext context, RemoteAttribute validationAttribute) :
base(metadata, context, validationAttribute)
{
}
public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
{
var rule = new ModelClientValidationRule
{
ErrorMessage = Messages.DuplicateUsername,
ValidationType = "remote"
};
rule.ValidationParameters.Add("url", Attribute.Controller + "/" + Attribute.Action);
return new[] { rule };
}
}
Класс модели моего представления имеет удаленный атрибут следующим образом:
[Remote(Controller = "SignUp",Action = "IsUsernameAvailable")]
public string Username { get; set; }
Я использую проверку jquery следующим образом:
jQuery.validator.addMethod("remote", function (value, element, params) {
if (this.optional(element)) {
return true;
}
if (value != '') {
$.post(params.url, { username: value }, function (response) {
return response;
});
}
});
В моем контроллере у меня есть несколько методов действий:
public JsonResult IsUsernameAvailable(string userName)
{
var isUsernameAvailable = _userService.IsUsernameAvailable(userName);
if (isUsernameAvailable)
{
return Json(true);
}
return Json(false);
}
По какой-то причине, даже если мой метод actiom IsUsernameAvailable возвращает true, сообщение проверки всегда отображается. Что я здесь не так делаю?