2013-07-05 164 views
0

我在玩ASP.NET MVC 4,但我對理解有些問題。爲了更好的解釋,我將使用一個簡單的「合成」情況。 比方說,我有一個2個屬性模特人:ASP.NET MVC 4 - 從視圖更新模型

  • 字符串名稱
  • PersonType類型(如學生,員工,軍事......)

讓我們在我的控制器說我有私有財產人。我可以在Index方法中初始化這個對象,傳入View並構建html頁面。好。

現在,當用戶在客戶端更新人員實例的字段之一(他可以輸入新的人員姓名或使用下拉列表選擇新的人員類型)時,我想立即更新我的模型。所以,我的一般問題是我該如何實現它?

明顯的解決方案對我來說:我可以發送一個ajax請求控制器從JS與新的數據。我認爲我可以調用控制器的方法UpdateName(字符串名稱)並手動更新屬性名稱與新數據。但是我的人員實例在這個方法裏面是NULL!我的第二個問題是爲什麼我不能從其他方法訪問初始化模型對象?我認爲這都是關於我對客戶端服務器交互的不瞭解。

我的情況的最後一種情況是:當用戶點擊按鈕「保存」時,我想將創建的人員保存到服務器端的文件中,但我不想使用任何表單並在剛剛收到所有需要的數據後點擊這個按鈕(因爲在我真正的任務中,我不能使用表單,並且在點擊按鈕後我無法從html頁面接收所有需要的字段)。

我發現了骯髒的解決方案。在JS中,我創建了具有相同屬性的另一個類Person。現在,我可以在需要時更新此類的實例,並將json數據傳遞給服務器以進行保存。

有沒有更好的解決方案?

回答

1

它不是髒了JavaScript對象來表示你的模型。事實上,這就是我如何做到這一點。我使用KnockoutJS給我一個客戶端模型 - 這實質上是MVVM模式。

您正試圖以不能使用的方式使用MVC模型。但是,Knockout模型,你可以使用你想要的。你基本上有一個你的服務器端模型的JavaScript表示,一旦你完成它,你發送它到服務器。

爲了讓您的服務器端方法獲取您的客戶端模型,您只需確保post請求包含數據,並且只要屬性名稱與它們自己匹配的方法的參數相同即可。

1

爲什麼我不能從其他方法訪問初始模型對象?

因爲它沒有被初始化。不要使用控制器類來存儲跨請求的持久數據。控制器對象在請求完成後處理,然後在新的請求上重新初始化。因此,當您到達另一個操作方法時,一個操作方法在課程級別保存的任何內容都將消失。從客戶端到服務器的每個請求應被視爲完全隔離的事件,獨立於以前的任何請求。

當您想要保存模型時,您將在該操作中執行的操作是從數據庫中重新獲取,應用更改並將其保存回數據庫。

,但我不希望使用任何形式的

我真的不知道你的意思在這裏。你的意思是你想使用AJAX而不是直接在頁面上發佈?如果是這樣,那很好。可能有很多工具可以幫助你,但我個人經常只是創建一個表單,而不是submit按鈕,我有一個普通的button並添加了一些JavaScript代碼(使用jQuery)來序列化表單並執行AJAX POST

只要POST值的鍵以與現成的表單相同的方式映射到您的模型字段,那麼您的操作方法仍然能夠接收適當的模型類型。在服務器端,無論是來自AJAX調用還是普通POST,都無關緊要。但是,不同之處在於,對於AJAX調用,響應應該可能是JSON格式,而不是以視圖響應。

因此,不是這樣的:

return View(someModel); 

你可能有這樣的事情:

return Json(someModel); 
+0

大衛,謝謝你真正有用的解釋!通過「我不想使用任何形式」我的意思是,在我的真實項目中,我無法通過單擊按鈕從頁面收集所有必需的字段。我使用的是動態加載的部分視圖,點擊按鈕時可以從頁面中刪除一些字段。那麼,我應該使用JavaScript ViewModel來獲取始終最新的數據嗎? –

相關問題