使用ASP.NET MVC Jquery Ajax序列化表单对象和集合

使用ASP.NET MVC Jquery Ajax序列化表单对象和集合,jquery,serialization,model-view-controller,Jquery,Serialization,Model View Controller,我正在学习使用VS2010和jQuery1.7.1的ASP.NETMVC4。我无法将我的收藏序列化回控制器。 我使用它将我的模型序列化为JSON对象 这是我的控制器: public class CustomerController : Controller { public ActionResult Index() { CustomerViewModel model = new CustomerViewModel(); model.Orders

我正在学习使用VS2010和jQuery1.7.1的ASP.NETMVC4。我无法将我的收藏序列化回控制器。 我使用它将我的模型序列化为JSON对象

这是我的控制器:

 public class CustomerController : Controller
{

    public ActionResult Index()
    {
        CustomerViewModel model = new CustomerViewModel();
        model.Orders = GetOrders().ToList();
        return View(model);
    }


    [HttpPost]
    public ActionResult Save(CustomerViewModel model)
    {

        if (ModelState.IsValid)
        {


        }

        return View(model);
    }

    private IEnumerable<Order> GetOrders()
    {
        List<Order> orders = new List<Order>();
        orders.Add(new Order() { OrderID = 1, CustomerID = 1, TotalAmount = 100.99M, OrderName = "Order1", Discount = 5.00M, TotalItems = 5, OrderDate = DateTime.Now });
        orders.Add(new Order() { OrderID = 2, CustomerID = 1, TotalAmount = 101.99M, OrderName = "Order2", Discount = 6.00M, TotalItems = 6, OrderDate = DateTime.Now });
        orders.Add(new Order() { OrderID = 3, CustomerID = 1, TotalAmount = 102.99M, OrderName = "Order3", Discount = 6.00M, TotalItems = 7, OrderDate = DateTime.Now });
        orders.Add(new Order() { OrderID = 4, CustomerID = 1, TotalAmount = 103.99M, OrderName = "Order4", Discount = 7.00M, TotalItems = 8, OrderDate = DateTime.Now });
        orders.Add(new Order() { OrderID = 5, CustomerID = 1, TotalAmount = 104.99M, OrderName = "Order5", Discount = 8.00M, TotalItems = 9, OrderDate = DateTime.Now });
        orders.Add(new Order() { OrderID = 6, CustomerID = 1, TotalAmount = 105.99M, OrderName = "Order6", Discount = 9.00M, TotalItems = 10, OrderDate = DateTime.Now });
        return orders;

    }

}
公共类CustomerController:控制器
{
公共行动结果索引()
{
CustomerViewModel模型=新CustomerViewModel();
model.Orders=GetOrders().ToList();
返回视图(模型);
}
[HttpPost]
公共操作结果保存(CustomServiceWModel模型)
{
if(ModelState.IsValid)
{
}
返回视图(模型);
}
私有IEnumerable GetOrders()
{
列表顺序=新列表();
添加(新订单(){OrderID=1,CustomerID=1,TotalAmount=100.99M,OrderName=“Order1”,折扣=5.00M,TotalItems=5,OrderDate=DateTime.Now});
添加(新订单(){OrderID=2,CustomerID=1,TotalAmount=101.99M,OrderName=“Order2”,折扣=6.00M,TotalItems=6,OrderDate=DateTime.Now});
添加(新订单(){OrderID=3,CustomerID=1,TotalAmount=102.99M,OrderName=“Order3”,折扣=6.00M,TotalItems=7,OrderDate=DateTime.Now});
添加(新订单(){OrderID=4,CustomerID=1,TotalAmount=103.99M,OrderName=“Order4”,折扣=7.00M,TotalItems=8,OrderDate=DateTime.Now});
添加(新订单(){OrderID=5,CustomerID=1,TotalAmount=104.99M,OrderName=“Order5”,折扣=8.00M,TotalItems=9,OrderDate=DateTime.Now});
添加(新订单(){OrderID=6,CustomerID=1,TotalAmount=105.99M,OrderName=“Order6”,折扣=9.00M,TotalItems=10,OrderDate=DateTime.Now});
退货订单;
}
}
视图:


客户详细信息
m、 客户名称)%>
m、 客户名称)%>
m、 Customer.LastName)%%>
m、 Customer.LastName)%%>
m、 客户邮箱地址)%>
m、 客户邮箱地址)%>
m、 客户电话号码)%%>
m、 客户电话号码)%%>
订单编号
订单名称
总金额
项目总数

$(函数(){ $('form')。提交(函数(e){ var customerViewModel=$(this.serializeObject(); var allOrders=新数组(); var顺序=null; var orderRows=$('#tblOrdersGrid')。find('tr')。not(':first'); $.each(orderRows,function(i,orderItem){ 顺序=新对象(); order.OrderID=$(orderItem).find('#tdOrderID').text(); order.OrderName=$(orderItem).find('#tdOrderName').text(); order.TotalAmount=$(orderItem).find('#tdTotalAmount').text(); order.TotalItems=$(orderItem).find('#tdTotalItems').text(); allOrders.push(订单); }); customerViewModel.Orders=allOrders; //customerViewModel['Orders']=allOrders; $.post(“”,CustomServiceWModel,函数(数据){ 警报(“已成功保存”); }); 返回false; }); });
模型类:

[Serializable]
public class Customer
{
    public Customer()
    {
        this.CreatedDate = DateTime.Now;
    }

    public int CustomerID { set; get; }

    [Required(AllowEmptyStrings = false)]
    public string FirstName { set; get; }

    [Required(AllowEmptyStrings = false)]
    public string LastName { set; get; }

    [Required(AllowEmptyStrings = false)]
    public string PhoneNumber { set; get; }

    [Required(AllowEmptyStrings = false)]
    public string EmailAddress { set; get; }

    [DataType(DataType.Date)]
    public DateTime CreatedDate { set; get; }

}

[Serializable]
public class Order
{
    public Order()
    {
        this.OrderDate = DateTime.Now;
    }

    public int OrderID { set; get; }

    public int CustomerID { set; get; }

    [Required(AllowEmptyStrings = false)]
    public string OrderName { set; get; }

    [Required()]
    public decimal TotalAmount { set; get; }

    [DataType(DataType.Date)]
    public DateTime OrderDate { set; get; }

    public decimal Discount { set; get; }

    public decimal TotalItems { set; get; }

}

[Serializable]
public class CustomerViewModel
{
    public CustomerViewModel()
    {
        this.Customer = new Customer();
        this.Orders = new List<Order>();
    }

    public Customer Customer { get; set; }
    public List<Order> Orders { get; set; }

}
[可序列化]
公共类客户
{
公众客户()
{
this.CreatedDate=DateTime.Now;
}
public int CustomerID{set;get;}
[必需(AllowEmptyStrings=false)]
公共字符串名{set;get;}
[必需(AllowEmptyStrings=false)]
公共字符串LastName{set;get;}
[必需(AllowEmptyStrings=false)]
公共字符串PhoneNumber{set;get;}
[必需(AllowEmptyStrings=false)]
公共字符串电子邮件地址{set;get;}
[数据类型(DataType.Date)]
公共日期时间CreatedDate{set;get;}
}
[可序列化]
公共阶级秩序
{
公共秩序()
{
this.OrderDate=DateTime.Now;
}
公共int-OrderID{set;get;}
public int CustomerID{set;get;}
[必需(AllowEmptyStrings=false)]
公共字符串OrderName{set;get;}
[必需()]
公共十进制总数{set;get;}
[数据类型(DataType.Date)]
public DateTime OrderDate{set;get;}
公共十进制折扣{set;get;}
公共十进制TotalItems{set;get;}
}
[可序列化]
公共类CustomServiceWModel
{
公共CustomerServiceModel()
{
this.Customer=新客户();
this.Orders=新列表();
}
公共客户客户{get;set;}
公共列表顺序{get;set;}
}
我可以将customer对象恢复到controller,但不知何故,我的订单集合没有恢复绑定。请参考以下屏幕截图:

任何线索都将不胜感激

更新1:

退房。一旦你有了一个好的JS对象,你可以添加任何你想要的东西。一旦你准备好了,你就可以简单地

然后

$.post('<%= Url.Action("Save", "Customer") %>', 
  JSON.stringify(customerViewModel), 
  function (data) {
    alert('Successfully saved.');
});
$.post(“”,
stringify(customerViewModel),
功能(数据){
警报(“已成功保存”);
});

我99%确定您不能将表单
序列化()
然后追加订单。如果您查看http请求(在Chrome->Dev Tools(F12)、Network选项卡、Filter、XHR中),我敢打赌该请求是一个经过Url编码的表单,并且
var customerViewModel = $(this).ToJson();  // or whatever you call this function
customViewModel.Orders = [];

var orderRows = $('#tblOrdersGrid').find('tr').not(':first');

$.each(orderRows, function (i, orderItem) {
  order = {};
  order.OrderID = $(orderItem).find('#tdOrderID').text();
  order.OrderName = $(orderItem).find('#tdOrderName').text();
  order.TotalAmount = $(orderItem).find('#tdTotalAmount').text();
  order.TotalItems = $(orderItem).find('#tdTotalItems').text();
  customViewModel.Orders.push(order);
});
$.post('<%= Url.Action("Save", "Customer") %>', 
  JSON.stringify(customerViewModel), 
  function (data) {
    alert('Successfully saved.');
});