【问题标题】:Sending an array of objects via AJAX - ASP.NET MVC通过 AJAX 发送对象数组 - ASP.NET MVC
【发布时间】:2015-11-21 15:00:13
【问题描述】:

所以在 JS 中得到了我需要的对象,我做到了:

$('.combine-payment-input').each(function (index, value) {
    if (parseFloat(value.value) > 0) {
       if (methodOfPayment == -1) {
            methodOfPayment = value.dataset.method;
       }
       else {
           methodOfPayment = 0;
       }
       vmopl.push({
            id: value.dataset.method,
            name: $('label[for="' + value.id + '"]').html(),
            inUse: 'True',
            ammount: value.value
       });
    }
});

如果我最后console.logvmopl,我会得到类似的东西

[Object { id="2",  name="Card",  inUse="True",  ammount="500"}, 
    Object { id="1",  name="Cash",  inUse="True",  ammount="250"}]

现在,如果我尝试将其发送到 AJAX,则使用

$.get('/reports/savebill/' + methodOfPayment + '?vmop=' + JSON.stringify(vmopl), function (data) {
    if (data == 'True') {
        location.href = '/order/neworder/';
    } else {
        alert("Unsuccessful!");
    }
});

控制器动作应该选择vmop,控制器看起来像这样:

public bool SaveBill(int id, ViewMethodOfPayment[] vmop) { 
    //lots of code... 
}

但是当我设置断点时,我总是将 vmop 视为 null,即使我将它传递给另一个对象 (var temp = vmop;)。

ViewMethodOfPayment 是一个简单的模型类:

public class ViewMethodOfPayment
{
    public long Id { get; set; }
    public string Name { get; set; }
    public bool InUse { get; set; }
    public double Ammount { get; set; }
}

如果我错过了任何信息,或者不清楚我想做什么/期待什么,请发表评论,我会尽快回复!

感谢阅读!

编辑:更改了第一块代码(第9行,因为我包含了一个会带来JavaScript错误的代码)

【问题讨论】:

  • 只要序列化表单就很简单了!
  • 如果你用 POST 方法发送数据会怎么样 :)
  • 而不是 ViewMethodOfPayment[] vmop 尝试使用 List<ViewMethodOfPayment> vmop
  • @GuruprasadRao 我先试试,实际上,我会用结果回复
  • 我觉得您的模型没有正确获取值,因为其中的属性区分大小写。因此,要么在推送到 vmop 时将其分配为 model,就像 id 应该是 Id.. 尝试一次..

标签: javascript c# jquery ajax asp.net-mvc


【解决方案1】:

我目前使用的:

Javascript 像您一样通过 JSON.stringify 发送数据。

C#:

public ActionResult AjaxDoSomething(string vmop)
{
    var jss = new JavaScriptSerializer();
    try
    {
        var parameter = jss.Deserialize<ViewMethodOfPayment []>(vmop);
        //Do something with this data and return the desired result
        return Json(result, JsonRequestBehavior.AllowGet);
    }
    catch
    {
        return null;
    }
}

【讨论】:

  • 我已经想到了这一点,但纯粹是因为那个额外的步骤(性能方面,这个网络服务不会在超快的服务器上运行),我把它作为最后的手段。编辑:我现在正在阅读编辑,接下来我会尝试,可能会带我一些。
  • 好点,OP 通常发送一个字符串,而不是一个数组,因为他使用JSON.stringify(vmopl)
  • 我不确定从这样的评论中它有多清楚,但它非常有效! (非常感谢您!)。 @TasosK。给了我一个澄清,它已经是一个字符串,所以我把它当作这样(比如在你编辑答案中的参数之前)并在你写它的时候把它变成一个对象。再次感谢您!
  • 感谢您对我编辑的示例中错误的参数类型的评论。这是我的一个错误,现在已经解决了。
【解决方案2】:

尝试将 [FromUri] 放在 ViewMethodOfPayment[] vmop 之前,如下所示

public bool SaveBill(int id,[FromUri] ViewMethodOfPayment[] vmop) { 
//lots of code... 
}

【讨论】:

  • 稍后会尝试。
  • [FromUri] 不属于任何已知的注释库?你从哪里实现它?
  • 如果你的控制器继承自 ApiController 你可以使用 [FromUri]
  • 问题是,因为这是一个团队项目,让它扩展 ApiController 是不可能的
猜你喜欢
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 1970-01-01
  • 2020-04-17
  • 2015-12-19
相关资源
最近更新 更多