Проверка на стороне клиента для обернутых / многомодельных представлений

У меня есть эти 2 класса моделей, заключенных в одну модель. Строго типизированное представление и проверка на стороне сервера работают достаточно хорошо, но я не могу заставить проверку на стороне клиента работать для этого обернутого класса модели.

Вот мой клиентский код:

Sys.Mvc.ValidatorRegistry.validators.usernameEmail = function (rule) {

    var emailProperty = rule.ValidationParameters.emailProperty;
    var message = rule.ErrorMessage;

    return function (value, context) {
        if (!value || !value.length) {
            return true;
        }

        var usernameField = context.fieldContext.elements[0];
        var emailFieldId = $('input[name = "' + emailProperty + '"]').attr('id');
        var emailField = $get(emailFieldId, usernameField.form);

        //...validation stuff...

    };
};

Проблема в том, что emailProperty возвращает только имя свойства, указанное в его модели, т.е. «EmailAddress», но строго типизированное представление назначает имя как «Model1Name.EmailAddress», поскольку оно называется так:

<%: Html.TextBoxFor(m => m.Model1Name.EmailAddress)%>

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

  1. Есть ли способ получить назначенное имя модели («Model1Name»), чтобы я мог добавить его к имени свойства?
  2. Могу ли я передать назначенное имя модели из классов DataAnnotations / ModelValidationRule? Если да, то как?

Вот мои классы моделей:

public class Model1
{
    public string EmailAddress{ get; set; }
    ...
}

public class Model2
{
    [UsernameEmail]
    public string Username{ get; set; }
    ...
}

public class WrappedModel
{
    public Model1 Model1Name{ get; set; }
    public Model2 Model2Name { get; set; }
}

Примечание: проверка на стороне клиента хорошо работает для видов одной модели.

Изменить. После долгой отладки я обнаружил, что

viewContext.ViewData.TemplateInfo.GetFullHtmlFieldId("EmailAddress");

в моем DataAnnotationsModelValidator возвращает только имя параметра «EmailAddress» и не учитывает его префикс «Model1Name», таким образом возвращая неправильный идентификатор.

Любая помощь будет оценена. Спасибо.


person iamnobody    schedule 05.09.2011    source источник


Ответы (1)


Ваш настраиваемый атрибут [UsenameEmail] - это элемент, который отвечает за отправку правильных метаданных проверки на стороне клиента. Точнее, для этого должен быть зарегистрирован адаптер валидатора. Вам необходимо убедиться, что адаптер генерирует полное имя свойства, то есть «Model1Name.EmailAddress», тогда клиентская функция «usernameEmail» получит правильное имя поля и будет работать должным образом.

См. «DataAnnotationsModelValidatorProvider.RegisterAdapter (...)» для получения дополнительных сведений. Вот пример реализации - http://weblogs.asp.net/jacqueseloff/archive/2009/12/17/asp-net-mvc-2-rc-validating-credit-card-numbers.aspx

person ivan    schedule 05.09.2011
comment
В приведенном вами примере выполняется проверка на стороне клиента одного свойства: того, которое украшено атрибутом проверки. OP необходимо сравнить значение свойства, украшенного атрибутом проверки, с другим свойством. - person Darin Dimitrov; 05.09.2011
comment
@ Дарин Димитров: я думаю, что iamnobody не нужно сравнивать два реквизита, есть другая проблема ... но я понял, что пропустил вещь в вопросе - я не заметил, что автор знает о классах правил проверки клиентов ... - person ivan; 05.09.2011
comment
@iamnobody: вы используете ‹%: Html.ValidationMessageFor (m =› m.Model1Name.EmailAddress)% ›? если да, то все должно работать нормально ... - person ivan; 05.09.2011
comment
он украсил свойство Username атрибутом и пытается получить значение свойства EmailAddress на клиенте. Полагаю, он делает это для того, чтобы сравнить их значения, но могу ошибаться. - person Darin Dimitrov; 05.09.2011
comment
Я пытаюсь сравнить два значения, но только что обнаружил, что проблема заключается в получении ПОЛНОГО идентификатора с префиксом. - person iamnobody; 05.09.2011