2014-01-14 127 views
2

使用WebApi v2我已經構建了一些將對象作爲參數的東西。我使用IValidateableObject和dataannotations進行模型驗證,我使用WebApi過濾器進行觸發。Validator.TryValidateObject不驗證屬性

但是,一個對象包含所有需要驗證的項目數組。我已經創建了一個自定義屬性,以便使用類似Asp.net Web Api nested model validation這樣的操作,但我無法驗證。另外 - 我已經使用了ValidateAllProperties標誌。

因此,我構建了一個控制檯應用程序來驗證行爲,驗證似乎沒有觸發(或者我錯誤地調用了API)。這裏是不適合我的東西:

namespace ConsoleApplication1 { using System; using System.Collections.Generic; using 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總是返回true。我在這裏做錯了什麼?

編輯 - 還試圖定義元數據類喜歡這裏: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

哦,是的!就是這樣。太感謝了。 –