2011-12-08 52 views
0

假設我們有class PersonModel,用戶在瀏覽器中編輯了一個詳細表單,並點擊了submit按鈕。ASP.NET MVC3僅更新必需字段

如何寫一個控制器邏輯來創建UPDATE SqlComand(無EF)和更新那些字段的從class PersonModelFirstName, LastName, Age...),其已被更改。 /Person/Edit/<id>控制器應該是什麼參數?

+3

爲什麼不使用ORM?這在當今時代是愚蠢的,因爲它爲你處理所有這些。你可能會開始一個項目,認爲一個ORM是矯枉過正的,然後隨着它的發展,你最終會以這種方式寫更多的代碼。 –

回答

2

你不會對你的MVC代碼做任何特殊的事情,也不會添加任何特殊的URL參數。

如果您只想更新更改的字段,則必須編寫大量代碼。您必須獲取當前記錄,將每個模型字段與記錄字段進行比較,找出哪些字段已更改,然後必須根據更改的字段構建SQL語句,然後更新它,確保使用optomistic記錄鎖定以確保當您檢索它時和更新它時,字段沒有發生變化。

這可能是幾百行代碼。或者,如果您使用ORM,它可能是一行代碼。另外,請記住,您還需要使用參數化語句,以確保不會發生SQL注入攻擊(您在ORM中免費獲得的東西)。

祝你好運,我當然不會寫它。

0

您可以使用Linq並讓datacontext爲您做所有事情。 在模型中,您只需使用linq查詢創建數據類,獲取更新,檢索對象,設置從您檢索的對象中視圖傳遞的所有值(無論如何您必須這樣做,因爲該模式將視圖從模型中分離出來|還記得,MVC實現了讓觀察者瞭解模型中的變化的觀察者,因此您無法知道視圖中從控制器中修改了什麼),然後致電DataContext.SubmitChanges();方法。數據上下文將自己完成這項工作。它會知道要更改和修改哪些內容,並且會提供最高性能的查詢。

+0

他說他沒有使用實體框架(我假設沒有其他類型的ORM),他想用SqlCommand生成SQL語句。 –

+0

Linq不是EF! – JuanC

+0

同樣Linq!= Linq到Sql – thiagoleite

1

我想說的是,你不使用廣義PersonModel,我認爲這是你的數據模型的1:1表示。你應該創建一個只有你關心的領域的淡化視圖模型。然後使用類似AutoMapper的東西將ViewModel映射回您的DomainModel。

以下是有關如何在這種情況下使用AutoMapper的參考。

How to cross map objects using AutoMapper

相關問題