【问题标题】:How to compose and post a JSON object from jQuery to an MVC3 action method?如何从 jQuery 编写 JSON 对象并将其发布到 MVC3 操作方法?
【发布时间】:2012-04-26 03:53:35
【问题描述】:

我有以下 JavaScript 代码,它从 Kendo UI 网格中的每个用户行获取 Id 属性 (Guid)。现在我想知道如何最好地将这些 Id 和所有者 roleId 组合成一个 JSON 对象,我可以将其传递给 MVC3 操作方法。与我愚蠢的字符串 concat 相比。

$("#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;
});

action 方法可以是 GET 或 POST 并且不需要返回任何值(这里是另一个谜题,没有返回视图)。它所做的只是由上述代码之后的其他 ajax 代码获取的域更新。

如何将上述类型的 JSON 传递给本质上为 void 返回类型的操作方法?

编辑: This question 很好地回答了我的问题的一小部分,如何使用push 动态地将项目添加到数组中。

【问题讨论】:

  • 你是在问如何准备json字符串(stringfy)?
  • @sakhunzai 不,而是如何动态构建我调用 stringify 的对象。然后,如何在操作中使用该对象。
  • 可能是您正在寻找这个:stackoverflow.com/questions/2277405/…,我可能无法在 MVC3 部分提供帮助,但如果您可以分享消费者方法,我可能会有所帮助。

标签: asp.net-mvc-3 model-view-controller jquery kendo-ui


【解决方案1】:

1.首先你不需要创建完整的 json 你自己使用JSON.Stringify() 方法将 javascript 对象更改为 JSON 字符串。
2.在你创建了 JSON 字符串后,你可以在任何公开的 MVC 控制器中使用GETPOST 将其用于任何常规方法。 即使action方法的签名是public ActionResult MehodName(string jsonString),你总是可以返回null。
3.您可以使用System.Web.Script.Serialization命名空间中的内置JavaScriptSerializer类来反序列化您在操作中收到的json字符串以创建具有相同属性的对象e
编辑:-
创建一个javascript数组名称users,然后在for循环中使用.push()javascript函数插入这样的对象

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:-
因此,按照您以前的 cmets,您不希望您需要对整个 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;}
}

它会自动将属性与您的复杂用户对象绑定

【讨论】:

  • 好的,但是如何在没有 concat 的情况下将 id 动态添加到即将成为 json 对象的数组中?
  • 如果这回答了您的问题,请不要忘记设置“标记为答案”。这也会对其他人有所帮助
  • 感谢@Parv,+1 提供了一些有用的代码和提示,但我更愿意以某种方式使用内置模型绑定和强类型操作方法来完全回答我的问题。
  • 不得不说,这种自动绑定很不错。
【解决方案2】:

应该可以使用 Url.Action("NameofAction","nameofcontroller", json); 您可能还必须将 AcceptVerbs 属性添加到操作方法,具体取决于您希望它是 GET 还是 POST。 就构建部分而言,我建议根本不使用字符串。 Json 是对象,而不是字符串,所以我会继续使用您的 foreach 循环构建一个“用户”对象,然后将该对象放入您的 json 返回对象中。

编辑:忘了提到字符串化。是的。使用它。

【讨论】:

  • 好的,在避免使用字符串时,我应该在控制器中绑定什么?
  • 您只需将您构建的 json 对象作为 Url.Action() 的参数提供(我不记得它的确切重载 - 我认为它的 Url.Action(Action, Controller,Argument) ),然后控制器中的相应操作应该接受您需要的任何类型的单个参数(前提是您正确设置了 JSON 对象),然后您就可以从控制器进行绑定
【解决方案3】:

结合 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;
});

【讨论】:

  • 谢谢,这主要是push我需要的。
猜你喜欢
  • 1970-01-01
  • 2016-06-05
  • 2012-03-22
  • 2012-08-05
  • 2013-01-23
  • 1970-01-01
  • 2013-03-16
  • 2011-06-14
  • 2020-09-13
相关资源
最近更新 更多