В ASP.NET MVC3, есть ли способ сделать тег [RegularExpression] динамическим?

#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.