2011-05-18 54 views
6

我有一個創建,查看這樣的...如何禁用ASP.NET MVC 3中的HttpPost操作中的驗證?

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" 
     type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" 
     type="text/javascript"></script> 

@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(null, new { @class = "validation" }) 
    ... 
    <input class="cancel" type="submit" value="OK" /> 
    ... 
    <input name="submit" type="submit" value="Save" /> 
} 

...以及相應的控制器動作:

[HttpPost] 
public ActionResult Create(string submit, MyViewModel myViewModel) 
{ 
    if (submit != null) // true, if "Save" button has been clicked 
    { 
     if (ModelState.IsValid) 
     { 
      // save model data 
      return RedirectToAction("Index"); 
     } 
    } 
    else // if "OK" button has been clicked 
    { 
     // Disable somehow validation here so that 
     // no validation errors are displayed in ValidationSummary 
    } 

    // prepare some data in myViewModel ... 

    return View(myViewModel); // ... and display page again 
} 

我發現,我可以通過設置class="cancel"禁用客戶端驗證在「確定」按鈕上。這工作正常。

但是,服務器端驗證仍然發生。有沒有一種方法可以在控制器操作中禁用它(請參閱上面「創建」操作中的else-block)?

謝謝你的幫忙!

回答

7

我最近有一個類似的問題。我想排除驗證的一些性質和使用下面的代碼:

ModelState.Remove("Propertyname"); 

要隱藏errormessages可以使用

ModelState.Clear(); 

但問題是,爲什麼您提交的值,如果你不使用它們?你會不會更好地使用重置按鈕來重置表單中的值:

<input type="reset" value="Reset Form"> 
2

服務器端驗證必須位於您的MyViewModel類中。你可以使用一個不實現驗證的類嗎? ViewModel中的數據註釋負責將ModelState.IsValid設置爲false。現在

+0

這是相同的強類型視圖,所以我認爲我不能使用另一個ViewModel。 – Slauma 2011-05-18 17:46:09

+0

@Slauma並非整個案例。你有一個單獨的視圖,使用模型X,可能擁有所有的驗證屬性。您可以創建模型Y,將模型X複製並粘貼到並刪除所有驗證屬性。此時您需要有2個獨立的表單發佈操作。所以創建(X)和TempSave(Y)。在TempSave(Y)結束時,您要麼重定向到原始操作(如果它可以加載臨時保存數據),或者您需要返回View(X),您可以輕鬆地將Y變爲X像ValueInjecter這樣的映射框架。 – 2011-05-18 17:51:44

+0

然後,您可以將javascript綁定到提交按鈕,該按鈕可以將表單的目標從TempSave更改爲Create。 – 2011-05-18 17:52:46

1

,我只是有這個想法:

​​

事實上,我不的ValidationSummary獲取消息了。這有沒有不利的副作用?至少目前我看不到問題......

+0

我剛剛寫道,你應該嘗試。如果您確定不想顯示這些錯誤,我認爲它不會有任何不利之處。我不確定爲什麼你不想顯示錯誤,如果他們點擊提交按鈕,什麼也沒有輸入。 – chobo2 2011-05-18 17:46:42

+0

@ chobo2:大聲笑,是的,現在有很多答案建議清除ModelState,所以我覺得確保它不是完全錯誤的。 「確定」和「保存」按鈕有所不同。只有「保存」按鈕寫入數據庫,因此需要驗證。 「確定」按鈕不寫入數據庫。它僅向ViewModel提取一些附加數據並重新顯示視圖。我不想在這一點進行驗證。這是一種依賴下拉列表邏輯:在第一個下拉列表中選擇條目,單擊「確定」,根據第一個下拉列表中的選擇填充第二個下拉列表。 – Slauma 2011-05-18 17:58:00

+0

啊我以爲你只是不想讓點擊空白表單的人顯示驗證。只要你確定任何不好的數據不會以某種方式到達其他地方(比如像在數據庫中盲目保存你似乎沒有做的那樣),我沒有看到使用它的任何錯誤。 – chobo2 2011-05-18 18:02:49

4

因此,如果您的提交字符串中沒有任何內容,您希望它忽略檢查模型狀態是否有效並假定它是。

但是,它仍在繼續,並通過驗證摘要檢查您的驗證並在客戶端顯示。

如果你真的不關心在這種情況下,錯誤嘗試

ModelState.Clear() 

,並刪除所有的錯誤出來。

+0

'它仍在繼續,並檢查您的驗證,並顯示在客戶端'我不相信是這種情況,因爲OP在他們的確定按鈕上說他們有取消類,我假設不假意地使旁路驗證爲客戶端。 – 2011-05-18 17:54:31

+0

@Chris Marisic - 我相信客戶端驗證被禁用(否則表單不會登頂),但他有一個Html.ValidationSummary(),它從服務器端獲取所有錯誤並將其放在頁面上。它最終出現在客戶端。那就是我在客戶端的意思。 – chobo2 2011-05-18 17:58:21