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

У меня есть эти 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)%>

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

  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", возвращая неверный идентификатор.

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

1 Ответ

0 голосов
/ 05 сентября 2011

Ваш пользовательский атрибут [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

...