2011-12-07 62 views
2

我有一個ASP.NET MVC應用程序,非常沉重地使用ajax(jQuery)。在大多數情況下,用戶永遠不會離開頁面 - 只是向控制器操作發出各種Ajax請求。在JavaScript中鏡像C#模型 - ASP.NET MVC

通常,在製作ajax POST時,我將一個對象從JavaScript傳遞給控制器​​操作。在大多數情況下,我在JavaScript中創建的傳遞給控制器​​的對象也以C#模型的形式存在,所以我真的用JavaScript來鏡像一些C#模型。

我的問題是 - 我是否在討論這個錯誤?我擔心的是我會在C#模型中更改一個屬性名稱,但忘記在JavaScript中更改它,直到它太晚並且用戶發現它時纔會知道它(我意識到單元測試會捕獲很多這樣的場景,但仍...)。

我正在考慮編寫一些自動生成器來將我的一些C#類鏡像爲JavaScript - 但在進入所有這些廢話之前,我想我會看看是否缺少明顯的東西。

在此先感謝您的幫助!

編輯:

我使用ASP.NET MVC,所以當我進行AJAX POST到控制器,我從AJAX傳遞數據被自動解析成控制器的方法參數,只要它們具有同名。

回答

0

請使用合適的JSON串行器/解串器。

我爲少數客戶使用了Json.NET。 http://james.newtonking.com/pages/json-net.aspx

+0

是的,但數據來源於客戶端(使用JavaScript)。我需要在JavaScript中創建一個具有類似命名屬性的對象,以JSON格式發送給控制器,對吧?我可能會在這裏錯過一些基本的東西...... – MattW

+0

@MattW - 是的,但JavaScript使這個很簡單。您只需使用JSON表示法創建一個對象。即'{a:1,b:2}'或任何您的對象被調用。 Json是JavaScript Object Notation的縮寫,注意這裏的術語「對象」。請參閱http://msdn.microsoft.com/en-us/library/bb299886.aspx –

+0

@Mystere感謝您的輸入!我很熟悉JSON。問題是,如果我的C#模型有一個屬性「a」(如你的例子),那麼我必須在JavaScript中鏡像該屬性名稱。如果我要在C#模型中更改屬性名稱「a」,則需要更改JavaScript中的JSON格式以鏡像我的C#對象,否則數據將不會被ASP.NET MVC自動分析。我今天所做的是創建具有與我的C#類相同屬性的JavaScript對象,並將其JSON格式傳遞給控制器​​。但是,如果屬性名稱發生更改,那麼該屬性將不再被解析 – MattW

1

退一步想一想。

你所做的一切就是通過HTTP發送一組鍵/值對作爲數據。

你應該做的是將這些鍵/值對映射到服務器上的域對象/模型。

默認的映射可以是Model屬性名稱,但是當您更改模型屬性名稱時無法更改HTTP API。

這破壞了與使用您的HTTP API的任何人的兼容性,合同曾經是{foo:..},現在{bar:..}。

基本上,您通過將模型更改傳播到HTTP API更改中而做錯了。

你想要的是一個Model.from(HTTPData)工廠或其他種類的Model.manipulate(HTTPData)函數。

+0

我想我已經在此處列出了基本構思 - 但我在查看實際實現時遇到問題。假設我需要通過ajax POST(不一定在

)將2個值 - 名稱和年齡 - 從JS傳遞到我的C#控制器。我們還假設我已經有一個叫做NameAgePair的C#模型,它只有這兩個屬性。在代碼中看起來像什麼(請相當漂亮)?感謝您一直以來的幫助! – MattW

+0

@MattW我所有的域對象都有一個['.construct'](https://github.com/Raynos/raynos-blog/blob/master/src/domain/post.js#L11)方法,它需要一個json數據並將其轉換爲真實的數據對象。如果我決定在我的域對象中將'content'更改爲'text',我會更改[this line](https://github.com/Raynos/raynos-blog/blob/master/src/domain/post.js# L17)爲'obj.text = post.content'。 – Raynos

+0

好的...所以你說你只是發送JSON數據到控制器,並讓控制器決定如何將它解析成對象(C#模型)?在這種情況下,如果您在JS中更改JSON屬性名稱,您的C#模型會不會被正確填充?再次感謝! – MattW