2012-04-13 55 views
0

我有以下JavaScript代碼從Kendo UI網格中的每個用戶行獲取Id屬性(Guid)。現在我想知道如何最好地將這些Id和所有者roleId組合成可傳遞給MVC3操作方法的JSON對象。與我的愚蠢的字符串concat。如何撰寫JSON對象並將其從jQuery發佈到MVC3操作方法?

$("#command-add-selected").click(function() { 
    var json = "roleId: '51FC554E-353C-4D55-BE52-1B4BF9D2F17F', users: ["; 
    var avail = $("#availableUsersGrid").data().kendoGrid._data; 
    for (var i = 0; i < avail.length; i++) { 
     json += "{ Id: '" + avail[i].Id + "'},"; 
    } 
    json = json.slice(0, -1); 
    json += "]"; 
    alert(json); 
    return false; 
}); 

操作方法可以是GET或POST,不需要返回任何值(這是另一個難題,沒有返回的視圖)。它所做的只是在上述代碼之後由其他ajax代碼獲取的域更新。

如何將上述類型的JSON傳遞給基本上爲void返回類型的操作方法?

編輯:This question回答我的問題的小部分很好,與如何動態項添加到陣列push

+0

你問如何準備JSON字符串(stringfy)? – sakhunzai 2012-04-13 19:20:20

+0

@sakhunzai不,相當於如何動態構建我稱之爲stringify的對象。那麼,如何在動作中使用該對象。 – ProfK 2012-04-13 19:32:43

+0

可能是你正在尋找這個:http://stackoverflow.com/questions/2277405/json-stringify-missing-from-jquery-1-4-1,我可能無法幫助MVC3部分,但如果你可以分享消費者的方法,我可能會有所幫助。 – sakhunzai 2012-04-13 19:57:56

回答

4

1.首先你不需要創建完整的json ur自我使用JSON.Stringify()方法將javascript對象更改爲JSON字符串。
2.在您創建了JSON字符串之後,您可以將其設置爲GETPOST它可用於任何MVC控制器中的任何常規方法。 即使動作方法的簽名像public ActionResult MehodName(string jsonString),你總是可以返回null。
3. u可以使用內置的JavaScriptSerializerSystem.Web.Script.Serialization命名空間反序列化JSON字符串ü在行動收到與同一propertiese
編輯創建一個對象: -
使JavaScript數組名users然後裏面的for循環使用JavaScript的.push()功能的嵌入式對象這樣

var users = []; 
for(something) 
{ 
var user = {"Id":"YOUR ID VALUE"}; 
users.push(user) 
} 
var objectToSerialize = {"roleId":"YOUR ROLE GUID","Users":users}; 
var jsonString = JSON.stringify(objectToSerialize); 

編輯2: -
由以前的意見,以便去ü不用想,美需要deseralize整個JSON對象。要通過你的對象架構即使烏拉圭回合的操作方法有這樣

public ActionResult GetUsersByRole(Users users) 
{ 
//some code 
} 

和用戶類像這樣的

class Users 
{ 
public string RoleId{get; set;} 
public User[]{get; set;} 
} 

和用戶類這樣

class User 
{ 
string Id{get; set;} 
} 

的簽名,它會自動將綁定您的複雜用戶對象的財產

+0

好吧,但我怎麼會動態地添加id的數組即將成爲JSON對象沒有concat? – ProfK 2012-04-13 19:28:18

+0

我已編輯幷包含您要求的代碼示例 – 2012-04-13 19:37:14

+0

如果這回答了您的問題,請不要忘記設置「標記爲答案」。這也會對其他人有所幫助 – 2012-04-13 19:46:19

0

應該只是能夠使用Url.Action(「NameofAction」,「nameofcontroller」,json); 您可能還必須將AcceptVerbs屬性添加到操作方法,具體取決於您希望它是GET還是POST。 就建築部分而言,我建議不要使用字符串。 Jsons是對象,而不是字符串,所以我會繼續使用foreach循環構建一個「用戶」對象,然後將該對象放入您的json返回對象中。

編輯:忘了提及stringify。是啊。使用它。

+0

好的,避免字符串,我在控制器中綁定了什麼? – ProfK 2012-04-14 04:32:30

+0

你只是給你的json對象,你作爲一個參數構建Url.Action()(我不記得它的確切重載 - 我認爲它的Url.Action(Action,Controller,Argument)),然後在你的控制器中相應的動作應該接受你需要的任何類型的單個參數(假設你設置了你的JSON對象),然後你就可以從控制器進行綁定了 – 2012-04-20 19:03:30

1

與Parv Sharma的解決方案相結合:

function User(id) { this.Id=id; } 

$("#command-add-selected").click(function() { 

    var avail = $("#availableUsersGrid").data().kendoGrid._data; 
    var userArray = array(); 
    for (var i = 0; i < avail.length; i++) { 
     userArray.push(new User(avail[i].Id)); 
    } 
    var obj = {roleId:'51FC554E-353C-4D55-BE52-1B4BF9D2F17F',users:userArray}; 
    alert(JSON.stringify(obj)); 
    return false; 
}); 
+0

謝謝,它主要是'push' I這方面的事情需要。 – ProfK 2012-04-13 19:41:10

相關問題