直接上视图的代码:
html代码表格:
View Code
1 <body> 2 <input type="button" value="保存" onclick="save()" /> 3 <hr /> 4 客户: 5 <input type="text" id="kehuxingming" /> 6 <hr /> 7 <table id="detailsTable"> 8 <tr> 9 <td>产品ID:</td> 10 <td> 11 <input type="text" name="productId" /></td> 12 <td>名称:</td> 13 <td> 14 <input type="text" name="prductName" /></td> 15 <td>数量:</td> 16 <td> 17 <input type="text" name="quantity" /></td> 18 </tr> 19 <tr> 20 <td>产品ID:</td> 21 <td> 22 <input type="text" name="productId" /></td> 23 <td>名称:</td> 24 <td> 25 <input type="text" name="prductName" /></td> 26 <td>数量:</td> 27 <td> 28 <input type="text" name="quantity" /></td> 29 </tr> 30 </table> 31 </body>
js代码:
View Code
1 <script src='@Url.Content("~/Scripts/jquery-1.7.1.min.js")'></script> 2 <script src='@Url.Content("~/Scripts/postify.js")'></script> 3 <script> 4 //保存方法 5 function save() { 6 7 //声明局部变量,构造json格式数据 8 var data = {}; 9 //为data动态添加属性 10 data.model = {}; 11 data.detailsList = []; 12 13 //存放订单表数据 14 data.model.KehuXingming = $("#kehuxingming").val(); 15 16 //each隐式迭代 17 $.each($("#detailsTable tr"), function (i, o) { 18 19 //将dom元素转换为Jquery对象 20 var obj = $(o); 21 //构造订单详细表数据数组:[{}] 22 23 var detail = {}; 24 //用find方法找到input标签对应产品属性,赋值给detail动态创建的属性 25 detail.ProductID = obj.find("input[name='productId']").val(); 26 detail.ProductName = obj.find("input[name='prductName']").val(); 27 detail.Quantity = obj.find("input[name='quantity']").val(); 28 29 //将detail加入data.detailList中 30 data.detailsList.push(detail); 31 32 }); 33 //此处获得构造出来的data要经过一个postify.js的特殊处理,后台才能接收到这个构造成json格式的数据 34 $.post('@Url.Action("SaveSaleOrder")', $.postify(data), function (html) { 35 if (html.result) { 36 alert("成功"); 37 } else { 38 alert(html.msg); 39 } 40 }); 41 } 42 </script>
js帮助:
View Code
1 $.postify = function (value) { 2 var result = {}; 3 4 var buildResult = function (object, prefix) { 5 for (var key in object) { 6 7 var postKey = isFinite(key) 8 ? (prefix != "" ? prefix : "") + "[" + key + "]" 9 : (prefix != "" ? prefix + "." : "") + key; 10 11 switch (typeof (object[key])) { 12 case "number": case "string": case "boolean": 13 result[postKey] = object[key]; 14 break; 15 16 case "object": 17 if (object[key] && object[key].toUTCString) 18 result[postKey] = object[key].toUTCString().replace("UTC", "GMT"); 19 else { 20 buildResult(object[key], postKey != "" ? postKey : key); 21 } 22 } 23 } 24 }; 25 26 buildResult(value, ""); 27 28 return result; 29 };
控制器方法:
View Code
1 #region 接受Ajax请求过来的json格式数据+JsonResult SaveSaleOrder(SaleOrder model, List<SaleOrderDetail> detailsList) 2 /// <summary> 3 /// 接受Ajax请求过来的json格式数据 4 /// </summary> 5 /// <param name="model">订单实体</param> 6 /// <param name="detailsList">订单详细实体</param> 7 /// <returns></returns> 8 public JsonResult SaveSaleOrder(SaleOrder model, List<SaleOrderDetail> detailsList) 9 { 10 try 11 { 12 //创建订单详细的xml对象 13 var detailsXml = detailsList.Select(c => new XElement("Detail", 14 new XAttribute("ProductID", c.ProductID), 15 new XAttribute("ProductName", c.ProductName), 16 new XAttribute("Quantity", c.Quantity) 17 )).ToList(); 18 /*生成的xml格式为下 19 <Detail ProductID=c.ProductID ProductName=c.ProductName Quantity=c.Quantity/> 20 */ 21 22 //创建订单的xml对象 23 var xml = new XElement("ROOT", new XElement("SaleOrder", new XAttribute("KehuXingming", model.KehuXingming), detailsXml)); 24 /* 25 SaveSaleOrder '<ROOT> 26 <SaleOrder KehuXingming="12312"> 27 <Detail ProductID="123" ProductName="123" Quantity="1231" /> 28 <Detail ProductID="1" ProductName="123" Quantity="2312" /> 29 <Detail ProductID="123" ProductName="123" Quantity="3" /> 30 <Detail ProductID="123" ProductName="123" Quantity="123" /> 31 </SaleOrder> 32 </ROOT>' 33 */ 34 35 //将xml转换为字符串 36 string xmlStr = xml.ToString(); 37 //linq to sql 38 DataClasses1DataContext db = new DataClasses1DataContext(); 39 //保存 40 db.SaveSaleOrder1(xmlStr); 41 return Json(new { result = true }); 42 } 43 catch (Exception ex) 44 { 45 //记录错误日志 ex 46 return Json(new { result = false, msg = "保存失败!" }); 47 } 48 } 49 #endregion
存储过程:
View Code
1 USE [TEST] 2 GO 3 /****** Object: StoredProcedure [dbo].[SaveSaleOrder] Script Date: 2013/1/4 星期五 1:08:06 ******/ 4 SET ANSI_NULLS ON 5 GO 6 SET QUOTED_IDENTIFIER ON 7 GO 8 ALTER PROCEDURE [dbo].[SaveSaleOrder] 9 @xml nvarchar(max) 10 AS 11 BEGIN 12 DECLARE @idoc int 13 14 --把字符串解析成xml存到内存中,然后把这个xml对象在内存中的地址返回给@idoc 15 EXEC sp_xml_preparedocument @idoc OUTPUT, @xml 16 17 --创建临时表 18 create table #saleOrder (kehuxingming nvarchar(50)) 19 create table #saleOrderDetails (productId int,productName nvarchar(50),quantity int) 20 21 --从xml里面取到主表的数据 22 INSERT INTO #saleOrder(kehuxingming) 23 SELECT KehuXingming 24 FROM OPENXML (@idoc, '/ROOT/SaleOrder',1) 25 WITH (KehuXingming nvarchar(50)) 26 27 --从xml里面取到从表的数据 28 INSERT INTO #saleOrderDetails(productId ,productName ,quantity ) 29 SELECT ProductID,ProductName,Quantity 30 FROM OPENXML (@idoc, '/ROOT/SaleOrder/Detail',1) 31 WITH (ProductID int,ProductName nvarchar(50),Quantity int) 32 33 --把主记录临时表 插入到 销售单的主表 34 INSERT INTO saleOrder(kehumingchen) 35 SELECT kehuxingming from #saleOrder 36 37 declare @id int 38 set @id=@@IDENTITY 39 40 --把从表临时表 插入到 销售单的从表 41 INSERT INTO saleOrderDetails(saleOrderId, productId, productName, quantity) 42 SELECT @id,productId ,productName ,quantity from #saleOrderDetails 43 44 drop table #saleOrder 45 drop table #saleOrderDetails 46 47 END
然后就实现了订单表和订单详细表的新增了。。