2010-06-15 1 views
0

Создав собственный атрибут проверки, полученный из System.ComponentModel.DataAnnotations.ValidationAttribute, я хочу иметь возможность обнаруживать с моего контроллера, был ли этот конкретный атрибут действительным на модели.Определить, был ли конкретный атрибут действительным на модели

Моя установка:

public class MyModel 
{ 
    [Required] 
    [CustomValidation] 
    [SomeOtherValidation] 
    public string SomeProperty { get; set; } 
} 

public class CustomValidationAttribute : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     // Custom validation logic here 
    } 
} 

Теперь, как я могу определить из контроллера, удалось ли проверка CustomValidationAttribute или нет?

Я искал свойство Exception ModelError в ModelState, но у меня нет возможности добавить к нему пользовательское исключение из моего CustomValidationAttribute.

Сейчас я прибегли к проверке для конкретного сообщения об ошибке в ModelState:

public ActionResult PostModel(MyModel model) 
{ 
    if(ModelState.Where(i => i.Value.Errors.Where((e => e.ErrorMessage == CustomValidationAttribute.SharedMessage)).Any()).Any()) 
     DoSomeCustomStuff(); 

    // The rest of the action here 
} 

И изменил мою CustomValidationAttribute на:

public class CustomValidationAttribute : ValidationAttribute 
{ 
    public static string SharedMessage = "CustomValidationAttribute error"; 

    public override bool IsValid(object value) 
    { 
     ErrorMessage = SharedMessage; 
     // Custom validation logic here 
    } 
} 

мне не нравится полагаться на совпадения строк, и таким образом свойство ErrorMessage используется неправильно.

Какие у меня варианты?

ответ

0

Я думаю, имеет смысл , чтобы иметь Enum с именем ExceptionType в CustomValidationAttribute, который четко определяет тип поднятого Исключения.

В контроллере мы можем проверить соответствующий тип исключения и обработать его.

try 
{ 

} 
Catch(Exception e) 
{ 
Switch(e.ExceptionType) 
{ 
    case ExceptionType.Val1: 

     // Handle accordingly 
     break; 
} 
} 
+0

Хм, я не вижу, как это будет работать с привязкой к модели. Исключение будет происходить до вызова действия. Я также не уверен, что это хорошая идея просто основывать дизайн на бросании исключений в методе CustomValidationAttribute.IsValid. Я имею в виду, что если то, что я проверяю с ним, недействительно, я должен просто вернуть false. –

Смежные вопросы