2012-11-27 45 views
1

字段列表是否可以安全地編程方式獲得了在剛調回到控制器的視場的名單?MVC4 - 讓在查看

我注意到腳手架的默認實現的一個問題,在

DB.Entry(model).State = EntityState.Modified 
DB.SaveChanges() 

的問題是,如果我沒有包括在視圖中進行編輯的字段,它是由默認覆蓋創建對象時.NET分配的字段的值。例如。如果我有一個ID,電子郵件和PasswordHash用戶類,我想允許用戶只更新他們的電子郵件地址,如果我不包括對PasswordHash場任何東西,因爲它是通過在控制器將被重置爲NULL作爲NULL。目前,我正在通過從數據庫中檢索當前對象並僅更新傳入的模型中的視圖中我知道的字段來解決此問題。對於小表而言,這不是一個問題,但我會喜歡有一個通用的解決方案,我可以全面應用,特別是對於可能在開發過程中的大型表格,我不想每次都更新代碼。

我知道我可以通過POST變量循環,並檢查他們看到的內容已經公佈,但造成安全問題,因爲用戶可以注入,我不想讓他們編輯其他字段。我想我可以明確地排除那些我不希望他們編輯的東西,但是再次,如果我能避免它,我寧願不必列出那些東西,因爲這是一個額外的事情。

我認爲,這裏有2個問題,我也不清楚是可以解決的......

  • 獲得該公佈哪些字段包含在查看後面
  • 建立視圖(我可能需要再次構造它,以暫時做到這一點?)

我想我可能會忽略忽略第一個,因爲我可以只在控制器上使用單個視圖的方法。這仍然不如我想要的那麼簡潔,但它確實減少了只在視圖中確定哪些字段的問題。

+0

到目前爲止,我已經得到了最好的辦法是找到視圖文件,讀取源文本和使用的正則表達式來定位領域。這很混亂,特別是如果我有部分觀點。它還會涉及遞歸地使用反射以允許字段通過屬性訪問其他記錄 – wizzardmr42

回答

1

如果視圖只需要某些屬性,創建具有隻有那些屬性的接口。在HttpGet和HttpPost方法中使用此接口。

然後你就可以使用類似AutoMapper到視圖模型映射到實體。

+0

這比在控制器中一次只複製一個字段更多的工作! – wizzardmr42

+0

這確實給了我使用New With {model.Email}的想法,並將其傳遞到函數中,以便將屬性複製到數據庫中的項目。不是我想要的,但肯定比我爲+1準備的更加整潔,但沒有回答這個問題 – wizzardmr42