#asp.net-mvc #asp.net-mvc-3
#asp.net-mvc #asp.net-mvc-3
Вопрос:
У меня в моей viewmodel есть что-то вроде
[RegularExpression(...)]
public string PenguinGenome
{
get;set;
}
public int PenguinSpecies
{
get; set;
}
Есть ли способ сделать … динамический на основе PenguinSpecies?
ie:
[RegularExpression(GetExpression(PenguinSpeciesId))]
public string PenguinGenome
{
get;set;
}
public int PenguinSpeciesId
{
get; set;
}
public string GetExpression(int speciesId)
{
if (.....)
return "[some regex]";
}
Это не сработает, потому что PenguinSpeciesId не существует в контексте. Каков наилучший обходной путь?
Комментарии:
1. Проблема в том, что атрибуты не могут содержать никаких нестатических ссылок, потому что они являются частью метаданных для определенного класса / свойства / чего угодно. Таким образом, вы не можете вызывать какие-либо методы или свойства для их создания.
Ответ №1:
Это статья для ASP.NET MVC2, но процесс довольно близок к тому же для ASP.NET MVC3.
По сути, вам нужно будет создать свой собственный пользовательский валидатор, который может просматривать объект, а затем определять правильный способ проверки.
Ответ №2:
Валидатор RegularExpression на самом деле не то, что вам нужно. Вы хотите проверить PenguinGenome на основе значения другого свойства модели. Другими словами, вам нужна не проверка свойств, а проверка модели.
Вы можете использовать атрибут проверки с учетом модели, но я лично не стал бы — потому что он «скрывает» зависимость (никто не может сказать, глядя на класс модели, что проверка penguinenome зависит от PenguinSpeciesId). Я бы предпочел использовать IValidatableObject здесь.
Комментарии:
1. С помощью тега регулярного выражения он автоматически поместит проверку регулярных выражений на мой взгляд. Будет ли это решение делать то же самое?
2. Нет, к сожалению, автоматически созданная проверка на стороне клиента не будет работать в вашем сценарии — сгенерированное регулярное выражение должно изменяться при любом изменении PenguinSpeciesId — это не поддерживается из коробки. Вы должны использовать пользовательскую логику проверки (jquery — ваш друг) или удаленную проверку, поддерживаемую MVC.