2014-01-14 4 views
2

Использование WebApi v2 Я построил что-то, что принимает объект в качестве аргумента. Я использую как IValidateableObject, так и dataannotations для проверки модели, которые я запускаю с использованием фильтра WebApi.Validator.TryValidateObject не проверяет атрибут

Однако один объект содержит массив элементов, которые все должны быть проверены. Я создал пользовательский атрибут, чтобы сделать это, используя что-то вроде Asp.net Web Api nested model validation, но я не могу получить подтверждение. Кроме того, я уже использую флаг ValidateAllProperties.

Итак, я построил консольное приложение, чтобы проверить поведение, и проверка не кажется запущенной (или я неправильно вызываю API). Вот что-то, что не работает для меня:

namespace ConsoleApplication1 { using System; с использованием System.Collections.Generic; с использованием System.ComponentModel.DataAnnotations;

class Program 
{ 
    static void Main() 
    { 
     var s = new Boundary { LowerDecimal = 1.1m }; 
     var isValid = Validator.TryValidateObject(s, new ValidationContext(s, null, null), new List<ValidationResult>(), true); 
     Console.WriteLine("Validation resulted in " + isValid); 
     Console.ReadLine(); 
    } 
} 

public class Boundary 
{ 
    [Range(0,1)] 
    public decimal LowerDecimal { get; set; } 
} 

}

IsValid всегда возвращает истину. Что я здесь делаю неправильно?

EDIT - также попытался определения класса MetaData как здесь: Validation does not work when I use Validator.TryValidateObject

+0

Не могли бы вы показать свой обычай' ValidationAttribute' код? Вышеупомянутое всегда будет возвращать true, потому что метод 'Validator.TryValidateObject' будет проверять только на' RequiredAttribute' для каждого из свойств указанного типа, он не распознает другие атрибуты проверки - поэтому вам нужно использовать настраиваемый атрибут , Это указано в разделе замечаний [docs] (http://msdn.microsoft.com/en-us/library/dd411772 (v = vs.110) .aspx). – James

+0

Этот атрибут Range находится внутри рамки, http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.rangeattribute(v=vs.110).aspx, также, я использовал http: //msdn.microsoft.com/en-us/library/dd411772(v=vs.110).aspx с булевым в конце, указывая «validateAllProperties», true, чтобы проверить все свойства; если false, проверяются только необходимые атрибуты ' –

+0

Код, на который я ссылался, был вашим пользовательским атрибутом, о котором вы писали. Документация довольно запутанная, раздел замечаний, похоже, противоречит тому, что говорит 'validateAllProperties'. Несмотря на это, я думаю, что вы правы, это не похоже на правильное поведение, вероятно, это должно быть проверка атрибута RangeAttribute на свойстве. – James

ответ

8

TryValidateObject является отвлекающим маневром, проблема на самом деле лежит на RangeAttribute.

Проблема заключается атрибут имеет 2 перегруженных (один для int и один для double), в своем определении атрибута вы объявивших int значения, что означает внутренне значение свойства отливают int, который обрезает с плавающей точкой - так сущность 1.1 будет усечена до 1, поэтому всегда будет в радиусе действия.

Простое исправление, убедитесь, что ваш атрибут знает, что вы хотите сравнить double «с и не int т.е.

[Range(0.0, 1.0)] 
public decimal LowerDecimal { get; set; } 
+0

Ох, да! Вот и все.Бесконечно благодарен. –