2015-06-30 22 views
0

我有一個控制器,預計List<int> 和展示奇怪的行爲,我寫出來的所有的ModelState錯誤,我寫出來的所有值空字符串會導致不正確的索引出現在ModelState中鍵

public class MyTestController : ApiController 
{ 
    public void Post(List<int> MyInts) 
    { 
     Debug.WriteLine("Errors: "); 
     foreach(string Error in this.ModelState.Keys) 
     { 
      Debug.WriteLine(Error); 
     } 

     Debug.WriteLine("Values:"); 
     foreach(int MyInt in MyInts) 
     { 
      Debug.WriteLine(MyInt.ToString()); 
     } 
    } 
} 

當我發帖:

[1, 2, 3, 4] 

我得到

Errors: 
Values: 
1 
2 
3 
4 

非常有意義。

下一個我張貼

[1, 2, 3.5, 4] 

我得到:

Errors: 
MyInts[2] 
Values: 
1 
2 
4 

非常有意義太

當我發佈

[1, "", 3, 4] 

我得到

Errors: 
MyInts[2] 
Values: 
1 
3 
4 

這是怎麼回事? MyInts [2]非常好,我甚至可以在價值觀中看到它。我需要這些數據是正確的,所以我可以告訴我的用戶他們需要修復哪個字段。

還有一個問題,如果我上傳:

[1.1, 2, 3, 4] 

我得到

Errors: 
MyInts[0] 
MyInts 
Values: 

因此,如果第一個值是無效的整個列表被宣佈無效,我留下了一個空列表。再次,我需要錯誤來說明出了什麼問題,我不知道這裏發生了什麼。

我遇到了這種行爲可空的DateTimes,它本質上是同一個問題。任何幫助將不勝感激,謝謝。

回答

0

您已經找到了一些不能按需使用的功能,而且無法更改,因此您需要實施替代解決方案。

我建議您閱讀關於Parameter Binding in ASP.NET Web API。在這個artcile中,以及最後的鏈接列表中,您將得到關於綁定如何工作的解釋,特別是如何定製綁定過程。

還有另一種更簡單的方法,但是應該在所有存在此問題的方法中實現:解析自己的請求並更正模型狀態。你可以用靜態方法來做到這一點,以便在發現這個問題的任何地方都可以重用它。

如果你想知道爲什麼會發生這種情況,你可以下載源代碼並進行調試。你可以在Codeplex找到關於ASP.NET web stacksource code的信息。

+0

將控制器中返回的數據類型作爲參數的全部要點是避免DTO - 如果我自己解析響應,它會爲流程引入一個全新的理論上不必要的層。我的意思是嘿,爲什麼不接受Post方法中的字符串併發送字符串化的json對象?我認爲這種行爲是微軟的錯,他們應該通過ModelState提供準確的錯誤報告。 –

+0

如果你正在尋找解決問題的方法,因爲有些東西不起作用,我已經指出了幾種不同的解決方案:在出現錯誤時自己的「手動」解析,爲數組工作的定製綁定器如預期的那樣,或者調試源代碼,並且理想地在項目中創建問題,甚至提供解決方案。除此之外,如果你想要我們可以討論誰是誰的錯,等等,但我認爲這是毫無意義的,不管我們討論多少,不幸的是它不會解決問題。 – JotaBe

相關問題