2012-04-13 25 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