2012-01-31 11 views
1

我採用了一種技術,將現有對象傳遞給表單,以便它們可以顯示對象的內容並允許用戶在必要時更改它。表單不會綁定到對象上,因此當表單行爲時,表單會將其控件的內容清除並將其放入對象中。然後驗證對象並將所有問題報告給用戶。如果對象是有效的,它可以被傳回給調用者,以便調用者可以刷新視圖/列表等。傳遞客戶端可能會失效的對象的首選技術

到目前爲止,這麼好。但是,如果表單的內容或缺少,創建無效對象並且用戶不糾正它,也許取消表單,則表單有可能會將無效對象返回給調用者。不是很好。

本質上,我正在尋找一種優雅而有效的方式,既可以讓對象保持原樣,也可以在用戶取消窗體/操作時回滾。

我已經考慮了一系列技術,每種技術都有很多優缺點。我很想考慮一些其他觀點。

+0

你試過序列化,然後反序列化你的對象來得到它的副本? – 2012-01-31 22:57:41

回答

0

過去,我通過在將對象傳遞給表單時製作一個淺表副本來解決此問題。然後,當副本回來時,您驗證它。如果檢出,則只需使用副本覆蓋原始對象。

private static void PassTheObj() 
    { 
    MethodThatAcceptsObj(realObject.Copy()); 
    } 

    private static void ValidateObj(customObject objCopy) 
    { 
    if (objCopy.IsValid()) realObject = objCopy; 
    } 
+0

這是我考慮過的一個好主意。然而,我不得不編寫具有許多屬性的淺對象的副本,並且還有可能對聚合進行更深入的研究。我只是懶惰嗎? – 2012-01-31 22:23:36

+0

@DavidOsborne哈哈,我不會在懶惰的面前判斷。 =)我不知道這是正確還是最優雅的方式,這只是我的方式。你的自定義對象是否有自己的方法等?如果不是,結構可能是一個可行的解決方案 - 但我承認,我的結構體驗是有限的。 – 2012-01-31 22:39:27

0

我的方法一直是:

驗證整個ViewModel。如果驗證,則提交更改。如果不驗證:

  • 因爲在這樣的有效形式的條目,把它作爲用戶輸入其
  • 在表單中的條目是無效的,如果它的正確格式相匹配(例如它是一個生日日期字段,但用戶輸入了一個1788年的日期),給出該值但將其標記爲無效
  • 對於表單中無效的條目,如果它與正確的格式不匹配(例如一個年齡段,但是用戶輸入了X),不給任何值(使其成爲空白)並將其標記爲無效。

希望幫助一些

0

例如,您可以

  • 添加IsValid()方法的對象,當窗體關閉,包含對象支票的有效性做

  • 添加一些state屬性的形式,它變成(說它是booleanfalse,並且當表格關閉時,您可以檢查該表單的狀態。

只是例子。

+0

這些都是可行的,謝謝你的想法。但是,由於該對象通過引用傳遞,表單可以更改該對象,使其無效。這似乎(氣味?)對我來說是錯誤的,因此我的問題。 – 2012-01-31 22:26:51

+0

因爲這可能是解決方案或克隆對象並傳遞給表單(如果對象很小)或者如果對象是大對象,則創建一個輕量級特殊表單對象並傳遞該對象。 – Tigran 2012-01-31 22:35:16

相關問題