MVC中实现订单表和订单详细表联动新增的一种方法
直接上视图的代码:
html代码表格:
![](/assets/blank.gif)
![](/assets/blank.gif)
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代码:
![](/assets/blank.gif)
![](/assets/blank.gif)
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帮助:
![](/assets/blank.gif)
![](/assets/blank.gif)
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 };
控制器方法:
![](/assets/blank.gif)
![](/assets/blank.gif)
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
存储过程:
![](/assets/blank.gif)
![](/assets/blank.gif)
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
然后就实现了订单表和订单详细表的新增了。。
转载于:https://www.cnblogs.com/jerrybing/archive/2013/01/04/2843546.html
MVC中实现订单表和订单详细表联动新增的一种方法相关推荐
- Database之SQLSever:SQLSever数据表管理(GUI法/SQL语句命令法两种方法实现建立表、修改表,以及增、删、改、查)之详细攻略
Database之SQLSever:SQLSever数据表管理(GUI法/SQL语句命令法两种方法实现建立表.修改表,以及增.删.改.查)之详细攻略 目录 一.两种方法建立表.修改表,插入多条数据记录 ...
- VS开发中的代码编写小技巧——避免重复代码编写的几种方法
原文:VS开发中的代码编写小技巧--避免重复代码编写的几种方法 上一篇文章中程序员的幸福生活--有你的日子,每天都是情人节,收到了大家的很多好评.鼓励和祝福,非常感动,真诚的谢谢大家.也希望每个朋友都 ...
- oracle数据表丢失数据库,Oracle数据库数据丢失恢复的几种方法总结
根据oracle数据库的特点和提供的工具,主要方法有以下几种方法: 利用逻辑备份使用import工具丢失数据的表 利用物理备份来通过还原数据文件并进行不完全恢复 利用dbms_logmnr包从redo ...
- c# 从一组数中随机抽取一定个数_C#产生指定范围随机数的几种方法-亮术网
在开发过程中,常常要产生随机数,如生成静态 html 网页时,文件名通常用产生随机数的方式获得,生成定单的时候,定单号也可以用产生随机数的方式获得等. 在 C# 中,一般都用 Random 产生随机数 ...
- 怎么修改计算机密码界面的背景,操作方法:在Win10中输入密码时如何修改登录界面的背景图片(两种方法)...
Win10系统的登录背景默认为"英雄"墙纸.我相信许多朋友对此感到厌倦. Win10没有提供自由更改的选项,但是我们可以通过某些方法或工具来更改登录背景. 方法1:手动修改 Win ...
- nag在逆向中是什么意思_OD调试4----去除nag窗口的几种方法
本实验所用程序如下,一个主窗口,两个nag窗口.nag本意为烦人唠叨的意思.在这里指的是不断弹出来窗口,例如注册窗口. 这里第一个和第三个为烦人的nag窗口,这里我们要将它去除.接下来就介绍四种方法, ...
- 在ML中缺乏数据可是个大问题,亲测有效的5种方法帮您解决
https://www.toutiao.com/a6701193162699833859/ 在我做过的很多项目中,公司虽然有非常棒的AI商业创意,但当他们意识到自己没有足够的数据时,却会慢慢的变得沮丧 ...
- nag在逆向中是什么意思_OD 实验(四) - 去除 NAG 窗口的几种方法
程序: 运行 弹出一个窗口,说要注册 点击确定,到主窗口 关闭主窗口 然后弹出提醒注册的对话框 逆向程序 用 OD 打开程序 GetModuleHandleA 获取程序模块的句柄,程序在内存中的基址 ...
- javascript中为某个对象(控件)绑定事件的几种方法
今天学习了javascirpt的一些基础知识,有关事件绑定的一些方法: 1.<input type="button" οnclick="clickHandler() ...
最新文章
- iOS开发 - 线程与进程的认识与理解
- Node.js小白开路(一)-- fs篇
- android唯一设备标识、设备号、设备ID的获取方法
- 检查 Linux 服务器性能
- 进程共享变量#pragma data_seg用法
- centos proftp_在CentOS上禁用ProFTP
- Go语言开发环境配置
- Spring MVC学习笔记——SiteMesh的使用(转)
- Key为数字的Json数据标准化成标准Json格式
- 解决移动端 footer fixd 定位被键盘顶起来的方案
- 拓端tecdat|R语言分位数回归、GAM样条曲线、指数平滑和SARIMA对电力负荷时间序列预测
- java 不变类_Immutable-不变模式与不变类-一版
- Arangodb Basic CRUD
- Android P 音频焦点管理
- UiPath PDF拆分与合并
- 软件设计架构中各模块breakdown
- WPF界面设计工具---Blend学习(一)
- 计算机主板上的模块安装和拆,更换计算机主板上的内存模块插槽需要多少费用?...
- python爬取微博数据词云_爬虫篇:使用Python动态爬取某大V微博,再用词云分析...
- strncasecmp函数
热门文章
- HTML标签meta在seo中的作用
- Greenplum数据库(GPDB)初识
- linux 分区 var,Ubuntu下移动/var目录到单独分区后出现的一些问题
- java中的dispose()方法
- Java JFrame实现全屏的四种方式
- MySQL 数据库修改访问权限,不能使用ip连接mysql问题处理:Host ‘host.docker.internal‘ is not allowed to connect to this ...
- Windows 技术篇 - 无需确认快速删除包含大量文件的目录,cmd删除文件的rmdir、del、erase和rd四种命令使用方法
- Mac 技术篇-苹果笔记本休眠启动后WIFI连接转圈卡死置灰不可用解决方法,mac通过终端杀进程实例演示
- JavaScript技术篇 - js的null值判断,js的undefined的判断,js的null与undefined的2种区分方法
- JavaSript实现调用google地图输入经度,纬度移动到该点,同时对点做标记