2012-06-11 55 views
0

我目前正在MVC 3中開發一個項目,在該項目中,我正在利用實體框架在兩個視圖中保留一個數據模型,每個視圖都包含一個HTML表單(類似於基於嚮導的設計)。MVC 3模型的剃刀部分驗證

然而,在用戶填寫第一個視圖的相應字段並提交表單後,會觸發整個模型的客戶端驗證,並且會顯示驗證錯誤,直到第二個View實例化。

我目前已經實施了一種解決方法,我完全關閉了第一個View的客戶端驗證,但是我當然不熱衷於使用尚未驗證的數據填充我的模型。這不好。 M'kay。

是否有任何方法來部分驗證第一個視圖上的字段,而不是觸發整個數據模型的閥值?

+1

你能告訴我們第一個視圖的代碼,並告訴我們哪些應用程序正在驗證嗎?這將使它成爲一個很容易解密的問題,然後 – RhysW

回答

0

這就是ViewModels來的地方。而不是直接綁定域模型和視圖,您應該創建視圖模型並綁定到視圖。

+0

我感謝您的意見,但它並沒有真正回答我的問題。如果可能的話,我想保持我目前的架構完好無損,並堅持一個「域」模型,就像你說的那樣。建議我利用ViewModels不直接解決我用部分驗證的問題。 – user1449244

+0

如果你已經有了一個體繫結構,你不能改變視圖模型,你必須去定製模型綁定器,SO註冊表中有很多線程。那。 – VJAI

0

如果您不需要直接在EF模型上進行驗證,那麼您可以根據需要使用MetadataType進行部分驗證。看看我的長example here on stackoverflow

+0

啊,是的,在我問這個問題之前,我在我的搜索中早些時候看到了這個解釋。這是非常徹底和相當詳細的,但唉,它不直接回答我的問題。我理解打破事情並通過接口類來處理驗證的概念,但我真的很想找到整體驗證部分驗證的答案。 – user1449244

+0

您是否需要直接在EF模型上進行驗證? –

+0

不一定,但這就是我目前的結構。 – user1449244

0

感謝您的全部輸入。但是,我能夠以非常簡單的方式獲得解決方案。通過將下面的代碼在第一個視圖的HttpPost元素...

if (ModelState.IsValidField("FirstField") && ModelState.IsValidField("SecondField")) return RedirectToAction ("NameOfAction", model); else return View();

...我是能夠實現局部領域的驗證。但是,這種特定於字段的方法只能在第一個View上的Submit按鈕具有類「cancel」的情況下工作,並且在上述操作之前手動清除生成的其他驗證錯誤(對於第一個View中不存在的字段)如果聲明。要做到這一點,請使用:

ModelState["FieldName"].Errors.Clear(); 

建築沒有重大變化。沒有部分的意見。不移交未驗證的數據。

工作得非常好......

注意:如果驗證錯誤,使用第二種觀點負載:

ModelState.Clear();

在第二視圖最初叫做行動。這將使第二個視圖加載乾淨無錯,同時在最終表單提交後仍然顯示驗證錯誤。