比方說,你有簡單的對象是這樣的:爲什麼默認模型聯編程序不在表單數據中時驗證字段?
public class MyObject {
public int Test { get; set; }
}
你指望默認的模型綁定,以確保發佈象下面這樣的形式,當用戶不離開「測試」字段爲空:
<form method="post" action="/test">
<p>
<%=Html.TextBox("Test") %>
<%=Html.ValidationMessage("Test") %>
</p>
<input id="Submit1" type="submit" value="submit" />
</form>
,因此這個動作:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Test(MyObject o) {
return View();
}
這一切時,表單數據包含了「測試」的主要預期作品(如「Test=val
「或」Test=
「)
但是,如果密鑰不在表單數據中,則驗證不會發生。因此,如果發送空白的請求或使用像AnotherField=foo
這樣的數據的請求,則模型對象上的屬性默認爲該類型的默認值(在此情況下爲0)。並且ModelState.IsValid
返回true。
這就是IMO,而不是人們所期望的行爲。
那麼你有什麼建議改變這種行爲?
編輯: 請記住,惡意用戶可以只篡改表單數據很容易與FireBug或Tamper Data插件通過默認的模型綁定的驗證,這可能會導致一些安全問題。
實際上,我試圖解釋的問題與計算客戶端驗證有點不同。我用DataAnnotationsModelBinder做了同樣的測試,得到了同樣的結果。問題是如果該字段不在表單數據中,驗證不會發生。 DataAnnotationsModelBinder:http://bradwilson.typepad.com/blog/2009/04/dataannotations-and-aspnet-mvc.html 我也來看看xVal。感謝您的迴應。 – 2009-04-24 12:52:18
爲了做你想做的事情,你需要一些方法來驗證表單值是否提供給表單中的所有字段。有沒有超級簡單的方法來自動做到這一點,我可以想到我的頭頂... – 2009-04-24 16:32:03