【问题标题】:ASP .NET MVC + Submit + JSONASP .NET MVC + 提交 + JSON
【发布时间】:2011-01-22 11:28:47
【问题描述】:

我需要在一个请求中发送模型数据和 JSON 数据。什么意思:

如果我用这个函数发送 JSON 数据:

    $("#SaveOrder").click(function () {
        $.ajax({
            url: '/Manager/AddOrder',
            type: 'POST',
            dataType: 'json',
            data: $.toJSON(ResultArray),
            contentType: 'application/json; charset=utf-8'
        });
    });

我有

public ActionResult AddOrder(SUPNew.Models.Order newOrder, List<OrderList> ResultArray)

SUPNew.Models.Order newOrder = null  
List<OrderList> ResultArray = not null

但如果我用&lt;input type="submit"&gt; 发送请求,我有

SUPNew.Models.Order newOrder = not null  
List<OrderList> ResultArray = null

如何在一个请求中发送 jQuery 数组(JSON 数据)和 SUPNew.Models.Order?


ResultArray-$.toJSON(ResultArray) 的内容,其中 ResultArray 是 jQuery 数组,如:

var CurrentOrder =
            [{
                'ProviderAn': $("#DdlProviders").val(),
                'ItemAn': $("#DdlItems").val()
            }];

这是 MVC 2

【问题讨论】:

  • ResultArray 的内容是什么?这是 MVC 3 吗?

标签: .net asp.net-mvc ajax json


【解决方案1】:

别忘了设置请求内容类型:

$('#SaveOrder').click(function () {
    $.ajax({
        url: '/Manager/AddOrder',
        type: 'POST',
        dataType: 'json',
        data: JSON.stringify({
            newOrder: { orderProp1: 'value1', orderProp2: 'value2' },
            resultArray: [
                { orderListProp1: 'value1', orderListProp2: 'value2' },
                { orderListProp1: 'value3', orderListProp2: 'value4' },
                { orderListProp1: 'value5', orderListProp2: 'value6' }
            ]
        }),
        contentType: 'application/json; charset=utf-8',
        success: function(result) {
            // the request succeeded
        }
    });

    // Don't forget to cancel the default action or if SaveOrder
    // is some link you might get redirected before the 
    // AJAX call ever had time to execute
    return false;
});

现在在服务器端,您可能需要一个新的视图模型来聚合这两个对象:

public class MyViewModel
{
    public Order NewOrder { get; set; }
    public List<OrderList> ResultArray { get; set; }
}

并且拥有:

[HttpPost]
public ActionResult AddOrder(MyViewModel model)
{
    ...
}

同样在服务器端,除非您使用默认支持 JSON 的 ASP.NET 3.0,否则您需要编写 custom handler capable of parsing it


更新:

您可以使用the following 将表单序列化为 JSON:

$.fn.serializeObject = function()
{
    var o = {};
    var a = this.serializeArray();
    $.each(a, function() {
        if (o[this.name]) {
            if (!o[this.name].push) {
                o[this.name] = [o[this.name]];
            }
            o[this.name].push(this.value || '');
        } else {
            o[this.name] = this.value || '';
        }
    });
    return o;
};

然后:

$.ajax({
    url: '/Manager/AddOrder',
    contentType: 'application/json',
    type: 'POST',
    dataType: 'json',
    data: JSON.stringify({
        newOrder: $('#SaveOrder').serializeObject(),
        resultArray: [
            { orderListProp1: 'value1', orderListProp2: 'value2' },
            { orderListProp1: 'value3', orderListProp2: 'value4' },
            { orderListProp1: 'value5', orderListProp2: 'value6' }
        ]
    }),
    contentType: 'application/json; charset=utf-8'
});

【讨论】:

  • @user568262,在我的回答中,我建议使用视图模型 (MyViewModel),它将聚合 NewOrderResultArray 属性并将它们作为单个 JSON 对象发送。您可以使用form.serialize() 分配NewOrder 属性,并将ResultArray 属性保留在我的示例中。这不适合你吗?
  • 我尝试了像 { ClientFIO : 'Hello' } 这样的假值,它适用于表单值并绑定到“Order NewOrder”。现在只需要为 form->json 数据序列化找到不错的插件,它应该可以工作。我希望:)
  • @user568262,请查看我更新中提出的技术是否适合您。
  • 是的,我在 5 分钟前发现了这个序列化并试图让它工作,但你的例子没有给任何错误的机会。太棒了,你是我的大师 :) 一切都很完美。抱歉,第一次发帖没仔细看。
  • 只是一个小问题。 AddOrder Action =\ 中的 RedirectToAction("Index") 不起作用
猜你喜欢
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多