Удаленная проверка ViewModel вложенных объектов не работает - PullRequest
10 голосов
/ 17 февраля 2011

У меня есть пользователь класса, который выглядит следующим образом:

public class User
{
    public int UserId { get; set; }

    [Required(ErrorMessage = "A username is required.")]
    [StringLength(20, ErrorMessage = "Your username must be 4-20 characters.", MinimumLength = 4)]
    [RegularExpression("^[a-zA-Z0-9]*$", ErrorMessage = "Your username can only consist of letters and numbers.")]
    [Remote("UsernameExists", "RemoteValidation", ErrorMessage = "Username is already taken")]
    public string Username { get; set; }

    [Required(ErrorMessage = "A password is required.")]
    [MinLength(4, ErrorMessage = "Your password must have at least 4 letters.")]
    public string Password { get; set; }

    [Required(ErrorMessage = "An email address is required.")]
    public string Email { get; set; }
}

Для функции регистрации я создал ViewModel, который содержит объект User и строку для подтверждения пароля:

public class RegistrationViewModel
{
    public User User { get; set; }

    [DisplayName("Password confirmation")]
    [Required, Compare("User.Password", ErrorMessage = "The password do not match")]
    public string PasswordConfirmation { get; set; }
}

Первая проблема, с которой я сталкиваюсь, заключается в том, что я не могу заставить работать проверку Сравнения ("User.Password"), так как он не находит свойства для пользователя.Есть ли способ проверить свойство PasswordConfirmation по свойству User.Password?

Вторая проблема - удаленная проверка поля Имя пользователя.Я следовал учебному пособию Дэвида Хейдена по адресу http://davidhayden.com/blog/dave/archive/2011/01/04/ASPNETMVC3RemoteValidationTutorial.aspx, но параметр username в методе UsernameExists всегда равен нулю.Я что-то здесь упускаю?

Редактировать:

Извините, но на самом деле я не совсем понял, какую ошибку я получаю для сравнения паролей.Работает нормально при заполнении полей, если пароли не совпадают, я получу сообщение об ошибке.Однако при отправке формы я получаю следующую ошибку в сводке проверки: не удалось найти свойство с именем UserToRegister.Password.

Редактировать 2:

Я выяснил часть проблемы, спасибона пост Джо.Удаленный валидатор отправляет обратно URL /? UserToRegister.Username = temp, который явно не соответствует параметру username моего действия контроллера.Чтобы сопоставить мой параметр действия с UserToRegister.Username, необходимо следующее:

public ActionResult UsernameExists([Bind(Prefix = "UserToRegister.Username")]string username)

Теперь этот параметр корректно передает параметр методу.Однако я все еще получаю сообщение об ошибке при использовании атрибута Compare в поле пароля.

Спасибо.

Ответы [ 3 ]

5 голосов
/ 02 марта 2012

Проблема с проверкой свойства PasswordConfigurmation для свойства User.Password вызвана ошибкой в ​​файле 'jquery.validate.unobtrusive.js'.

Изначально функция jquery 'equalTo':

adapters.add("equalto", ["other"], function (options) {
var prefix = getModelPrefix(options.element.name),
other = options.params.other,
fullOtherName = appendModelPrefix(other, prefix),
element = $(options.form).find(":input[name=" + fullOtherName + "]")[0];

setValidationValues(options, "equalTo", element);
});

Вам просто нужно изменить эту строку:

element = $(options.form).find(":input[name=" + fullOtherName + "]")[0];

на:

element = $(options.form).find(":input[name='" + fullOtherName + "']")[0];

Обратите внимание на добавление в одинарных кавычках вокруг селектора 'fullOtherName'.После внесения этого изменения проверка на стороне клиента работает, как и ожидалось.

1 голос
/ 17 февраля 2011

В части удаленной проверки у меня ничего не выскакивает.Может быть полезно открыть firebug и посмотреть, как выглядит запрос, который запускается.Вы должны увидеть что-то вроде этого, если все правильно подключено ...

http://localhost:14547/[Controller]/[ActionName]?[ParamName]=[paramValue]

Из запроса, который вы предоставили, вы можете либо использовать префикс, который вы закончили, либо вы можете сделатьдействие выполнить пользователя с именем UserToRegister, а затем в рамках действия получить доступ к свойству UserName.Это рекомендуемый способ работы с удаленной проверкой объектов, и о нем может быть немного проще думать, чем при использовании атрибута Bind.

При проверке сравнения кажется, что на стороне клиента проверка выполняется успешно, но припроверка на стороне сервера завершается неудачно, поскольку контекст проверки не содержит свойство с именем User.Password, только свойство с именем User.

0 голосов
/ 17 февраля 2011

Наследование кажется стандартным способом добавления функциональности в этом случае.Как насчет того, чтобы ваш RegistrationViewModel происходил от UserViewModel:

public class RegistrationViewModel : UserViewModel
{
    [DisplayName("Password confirmation")]
    [Required]
    [Compare("Password", ErrorMessage = "The password do not match")]
    public string PasswordConfirmation { get; set; }
}

и:

public ActionResult UsernameExists(string Username)
{
   ...
}
...