2010-04-27 22 views
3

我有一個簡單的模型FilesModel更新字符串Description和複選框Archived的幾個(已上傳)文件的布爾值,並FilesModel有一個驗證FilesModelValidator當這些數據被髮布時它會運行。這個驗證器不過是檢查每個文件是否有描述。我知道它運行並根據我的調試到目前爲空描述正確返回一個錯誤。MVC驗證錯誤的時間控制消失給予控制器

但是,當控制器中的Action方法被給予控制時,ModelState與我所期望的不同。說明字段上沒有錯誤,但每個選中的複選框都有一個錯誤:「'上'的值對存檔無效。」

驗證此類工作在網站的其他方面工作得很好,所以我確定有一些我可以忽略的東西。任何有關爲什麼會發生這種情況的建議以及如何解決它?

驗證

public FilesModelValidator() 
{ 
    RuleFor(f => f.Files) 
     .Must(AllHaveADescription).WithMessage("Must have a description"); 
} 

public static bool AllHaveADescription(Files files) 
{ 
    // This is run on postback, and returns false when any Description is empty 
    return files.All(f => f.Description != null && f.Description.Length > 0); 
} 

控制器

[HttpPost] 
public virtual ActionResult Update(FilesModel model) 
{ 
    // At this point, ModelState contains an error for each checked checkbox 
    // and no errors for empty descriptions 
    if (ModelState.IsValid) 
    { 
     // Save 
    } 
    return View(model); 
} 
+0

你怎麼會有你的驗證器連接好?屬性屬性還是隻是一些基於實體的邏輯? – jeriley 2010-04-27 18:40:51

+0

屬性。以下是'FilesModel'類的屬性:'[Validator(typeof(FilesModelValidator))]' – Aaron 2010-04-27 18:42:03

+0

它可以簡單地運行驗證兩次並刪除您的退出錯誤? (使用自定義模型綁定器可能?)另外,我依稀記得有關注冊數據註釋(?)的東西..但這會給你所有的問題,並且你正在使用一個以上的權利? – jeriley 2010-04-27 19:48:54

回答

8

事實證明,複選框的事情是整個問題。我在代碼的其他地方找到了解決這個問題的一個解決方案,所以我使用了它。它看起來有點不好意思,但它有效。

這個想法是,你需要確保複選框的值是true而不是「on」。所以這樣做:

<input type="hidden" id="myCheckbox" value="false" /> 

如果未選中複選框,該複選框價值沒有得到:

<input type="checkbox" id="myCheckbox" value="true" /> 

然後用它的值相同的ID false複選框後,立即添加一個隱藏的輸入發佈回服務器。所以當回發發生時,服務器看到myCheckbox=false這正是我們想要的情況。當複選框時,均爲將輸入值發佈到服務器。但是服務器只使用第一個值(這是複選框本身的值,因爲我們把它放在隱藏域之前)。所以服務器看到myCheckbox=true

+1

感謝這個巧妙的解決方法。但是,具有相同id屬性的兩個元素是無效標記。相反,你應該給他們不同的ID,但添加屬性名稱=「myCheckbox」這兩個元素。這達到了相同的結果,但有效的標記。 – 2012-05-16 10:48:41

+0

@RichardFawcett - 我是有效標記的信徒,所以謝謝你! – Aaron 2012-05-16 17:04:31

+0

輕微挑剔。你根本不需要隱藏的輸入。如果你的輸入綁定到一個bool,那麼它只會導致錯誤。模型狀態也是有效的。您所需要的只是輸入具有綁定的值的名稱,而'value =「true」'。 Id只用於客戶端,與模型綁定無關。 – 2013-03-18 00:41:57

0

我有同樣的問題對被鏈接到一個枚舉,在一個下拉的項目。我已經刪除了默認值,所以當有人沒有選擇一些東西時,我得到了一個錯誤。

所以,說了這麼多,我認爲你的問題可能有點相關,因爲當你的模型正在期待yes/no或者反過來時,活頁夾正在尋找真/假。

解決這個問題的兩種方法可能是將您的視圖更改爲True/False,或者,這就是我自己編寫自己的ModelBinder,它將從Yes轉換爲True。

我希望這對你有一些幫助。

+0

我有一個自定義模型綁定器,可以正確解釋複選框的值,並且模型上的布爾值被正確設置爲true或false。看來,這不是模型綁定,而是一個我沒有看到的驗證器。 – Aaron 2010-04-28 15:16:06

3

我曾經在視圖下,而不是手動創建的複選框:

Html.CheckBox("FieldName")