У меня есть эти 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 при поиске свойства, и я получаю сообщение об ошибке. Итак, я думаю, что мои вопросы здесь будут:
- Есть ли способ получить назначенное имя модели («Model1Name»), чтобы я мог добавить его к имени свойства?
- Могу ли я передать назначенное имя модели из классов 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», таким образом возвращая неправильный идентификатор.
Любая помощь будет оценена. Спасибо.