2011-05-19 65 views
4

我有這樣的代碼在我的控制器:旁路MVC驗證的GET請求

我不喜歡這樣做的原因是因爲註冊頁面可預先填入從其他網頁生成的查詢字符串值。

問題是,當我的視圖呈現時,它顯示驗證錯誤...有沒有辦法繞過它?

回答

2

通常當運行這樣的動作時,您會傾向於使用單獨的參數而不是完整的模型;看起來正在發生的事情是模型綁定器正在踢你併爲你驗證你的模型。

您可以通過調試ModelState.IsValid爲false的操作進行驗證,並且它有一些關鍵字與模型上的字段無關嗎?如果是這樣,則可以在返回視圖之前嘗試執行ModelState.Clear(),以防止在此情況下顯示驗證錯誤。

0

我有同樣的問題,我在創建操作的模型中使用了CustomValidation屬性,但是另一個操作需要將更改保存到數據庫驗證導致的錯誤。所以我通過移除CustomValidation屬性和驗證模型的創建操作方法裏面只有

4

快速解答固定它:嘗試使用[ValidateInput(假)]在您的「GET」操作方法

更新: 使用asp.net 4,爲了讓框架確認ValidateInput屬性,您還需要在web.config中配置驗證模式。

設置以下爲<system.web>元素的子:

<httpRuntime requestValidationMode="2.0"/> 

爲什麼在你的「GET」的操作方法有一個視圖模型?

利用默認的模型聯編程序。

例如,我們有Child Actions返回綁定到複雜ViewModels設置的部分視圖,我們不希望爲每個Child Action顯式實例化和重建ViewModel。

例如,訂單頁面的編輯頁面需要一個EditOrderViewModel,它繼承BaseUserViewModel,後者又包含用戶特定的顯示數據(用戶名,購物車項目數量等)。

所以操作方法返回編輯觀點是這樣的:

[ValidateInput(false)] 
[HttpGet] 
public ViewResult Edit(EditOrderViewModel editOrderVm) 
{ 
    ... 
    return View('Edit', editOrderVm); 
} 

現在只要申請到這個孩子的行動方法包括BaseUserViewModel的性能在某種程度上(例如,通過餅乾,形式和查詢字符串屬性),那麼默認模型聯編程序將實例化並用所有基本視圖模型數據填充EditOrderViewModel。

但是,當我們第一次加載這個頁面時,我們不希望驗證信息以用戶沒有機會編輯的形式顯示出來......

因此,我們關閉'GET'請求的模型驗證>確保您驗證'POST'請求!

+0

在MVC 5中添加'ValidateInput(false)'不起作用。由於視圖模型參數,仍然執行驗證。 – 2015-04-08 10:55:47