2009-08-13 45 views
6

我有一個網站,我使用fluentNhibernate和Asp.net MVC。我有一個編輯視圖,允許用戶編輯該記錄(對象)的10個屬性中的8個。當您提交表單並且模型綁定時,這兩個不可編輯的字段將作爲空字符串返回到視圖模型中,或作爲默認日期時間值返回,具體取決於屬性的類型。當你的視圖模型沒有像你的域模型那麼多的字段時,你如何忽略/保持MVC中的值?

因爲我也使用AutoMapper將我的視圖模型映射到我的域實體,所以我不能只從數據庫加載我的對象的新副本,並手動設置2缺少的屬性。堅持那些我不想編輯的領域最好的辦法是什麼?

確實有效的一種方法是將我的視圖中隱藏的輸入字段中的值保留下來。這有效,但感覺很糟糕。我很欣賞任何建議。我的AutoMapper中有一種方法來配置這個所需的功能嗎?

UPDATE: 好了,我想我不是要忽視領域,我想確保我不堅持null或空字符串值。忽略AutoMapper中的字段就是這樣做的,它們會被忽略,當我嘗試將它們映射到保存到我的存儲庫之前時,它們會爲空。

+0

爲什麼不可編輯的字段甚至是視圖模型的一部分是否有原因? – mxmissile 2009-09-04 15:52:02

+0

目前他們不是視圖模型的一部分,這似乎是問題的一部分。這些字段是'AddedBy'和'DateAdded'。一旦創建了這個對象,就不應該改變它們。我試圖連接編輯視圖而不會丟失數據。當我從我的視圖模型映射到我的模型時,使用Automapper將null數據取出 – shanabus 2009-09-08 18:00:11

回答

2

asp.net mvc DefaultModelBinder是可擴展的,你可以覆蓋它來創建你自己的綁定模式。但是,這將涉及更多的工作,而不是兩個「隱藏的輸入領域」,在我看來,這不是那麼嚴重。

+1

我認爲隱藏的輸入字段是粗略的。除了將數據發送給客戶端以便將其發送回客戶端之外,還可以對其進行修改。我使用不可編輯的字段來表示所有權,創建日期等。 – 2009-08-14 10:01:25

+1

JW,它不是2個隱藏的輸入字段是粗略的 - 但是我將要處理的下一個視圖將包含更多像10個隱藏輸入字段。那是當我開始質疑這種方法。這是一個內部應用程序,但詹姆斯S也有一個好點 - 這些字段可能被篡改。 – shanabus 2009-08-14 12:30:52

+0

雖然我很猶豫,相信這是最好的解決方案,但我會使用這個解決方案。 – shanabus 2009-09-08 18:03:02

2

你可以告訴Automapper忽略2個屬性:

Mapper.CreateMap<Source, Destination>() 
.ForMember(dest => dest.SomeValuefff, opt => opt.Ignore()); 

Possible related question

+0

我試過了,我只是得到空值而不是空字符串,並且DateTime屬性會返回默認值。 – shanabus 2009-08-14 12:28:43

+1

好吧,我回過頭來看 - 如果我在映射之前從存儲庫加載對象,那麼您的解決方案就會起作用。這樣,被忽略的字段將不會覆蓋新加載的對象 - 只有我想要更新的字段將會被覆蓋。謝謝 – shanabus 2009-08-14 13:32:17

+1

對不起,我拒絕了這個答案,因爲正如我在第一條評論中提到的那樣,Ignore()會導致該屬性被'新增'。也就是說,忽略DateTime屬性將它設置爲'01/01/0001',而忽略字符串屬性將它設置爲「」,而不是null。 – shanabus 2009-09-04 14:53:36

0

您是否可以使用也接受TEntity的AutoMapper.Map重載?

entity = Mapper.Map(viewmodel, entity); 

只要你沒有在你的視圖模型的屬性,它不會改變你的實體值。它需要傳入的實體並僅將視圖模型中的屬性應用回實體。

相關問題