直接上视图的代码:

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

然后就实现了订单表和订单详细表的新增了。。

转载于:https://www.cnblogs.com/jerrybing/archive/2013/01/04/2843546.html

MVC中实现订单表和订单详细表联动新增的一种方法相关推荐

  1. Database之SQLSever:SQLSever数据表管理(GUI法/SQL语句命令法两种方法实现建立表、修改表,以及增、删、改、查)之详细攻略

    Database之SQLSever:SQLSever数据表管理(GUI法/SQL语句命令法两种方法实现建立表.修改表,以及增.删.改.查)之详细攻略 目录 一.两种方法建立表.修改表,插入多条数据记录 ...

  2. VS开发中的代码编写小技巧——避免重复代码编写的几种方法

    原文:VS开发中的代码编写小技巧--避免重复代码编写的几种方法 上一篇文章中程序员的幸福生活--有你的日子,每天都是情人节,收到了大家的很多好评.鼓励和祝福,非常感动,真诚的谢谢大家.也希望每个朋友都 ...

  3. oracle数据表丢失数据库,Oracle数据库数据丢失恢复的几种方法总结

    根据oracle数据库的特点和提供的工具,主要方法有以下几种方法: 利用逻辑备份使用import工具丢失数据的表 利用物理备份来通过还原数据文件并进行不完全恢复 利用dbms_logmnr包从redo ...

  4. c# 从一组数中随机抽取一定个数_C#产生指定范围随机数的几种方法-亮术网

    在开发过程中,常常要产生随机数,如生成静态 html 网页时,文件名通常用产生随机数的方式获得,生成定单的时候,定单号也可以用产生随机数的方式获得等. 在 C# 中,一般都用 Random 产生随机数 ...

  5. 怎么修改计算机密码界面的背景,操作方法:在Win10中输入密码时如何修改登录界面的背景图片(两种方法)...

    Win10系统的登录背景默认为"英雄"墙纸.我相信许多朋友对此感到厌倦. Win10没有提供自由更改的选项,但是我们可以通过某些方法或工具来更改登录背景. 方法1:手动修改 Win ...

  6. nag在逆向中是什么意思_OD调试4----去除nag窗口的几种方法

    本实验所用程序如下,一个主窗口,两个nag窗口.nag本意为烦人唠叨的意思.在这里指的是不断弹出来窗口,例如注册窗口. 这里第一个和第三个为烦人的nag窗口,这里我们要将它去除.接下来就介绍四种方法, ...

  7. 在ML中缺乏数据可是个大问题,亲测有效的5种方法帮您解决

    https://www.toutiao.com/a6701193162699833859/ 在我做过的很多项目中,公司虽然有非常棒的AI商业创意,但当他们意识到自己没有足够的数据时,却会慢慢的变得沮丧 ...

  8. nag在逆向中是什么意思_OD 实验(四) - 去除 NAG 窗口的几种方法

    程序: 运行 弹出一个窗口,说要注册 点击确定,到主窗口 关闭主窗口 然后弹出提醒注册的对话框 逆向程序 用 OD 打开程序 GetModuleHandleA 获取程序模块的句柄,程序在内存中的基址 ...

  9. javascript中为某个对象(控件)绑定事件的几种方法

    今天学习了javascirpt的一些基础知识,有关事件绑定的一些方法: 1.<input type="button" οnclick="clickHandler() ...

最新文章

  1. iOS开发 - 线程与进程的认识与理解
  2. Node.js小白开路(一)-- fs篇
  3. android唯一设备标识、设备号、设备ID的获取方法
  4. 检查 Linux 服务器性能
  5. 进程共享变量#pragma data_seg用法
  6. centos proftp_在CentOS上禁用ProFTP
  7. Go语言开发环境配置
  8. Spring MVC学习笔记——SiteMesh的使用(转)
  9. Key为数字的Json数据标准化成标准Json格式
  10. 解决移动端 footer fixd 定位被键盘顶起来的方案
  11. 拓端tecdat|R语言分位数回归、GAM样条曲线、指数平滑和SARIMA对电力负荷时间序列预测
  12. java 不变类_Immutable-不变模式与不变类-一版
  13. Arangodb Basic CRUD
  14. Android P 音频焦点管理
  15. UiPath PDF拆分与合并
  16. 软件设计架构中各模块breakdown
  17. WPF界面设计工具---Blend学习(一)
  18. 计算机主板上的模块安装和拆,更换计算机主板上的内存模块插槽需要多少费用?...
  19. python爬取微博数据词云_爬虫篇:使用Python动态爬取某大V微博,再用词云分析...
  20. strncasecmp函数

热门文章

  1. HTML标签meta在seo中的作用
  2. Greenplum数据库(GPDB)初识
  3. linux 分区 var,Ubuntu下移动/var目录到单独分区后出现的一些问题
  4. java中的dispose()方法
  5. Java JFrame实现全屏的四种方式
  6. MySQL 数据库修改访问权限,不能使用ip连接mysql问题处理:Host ‘host.docker.internal‘ is not allowed to connect to this ...
  7. Windows 技术篇 - 无需确认快速删除包含大量文件的目录,cmd删除文件的rmdir、del、erase和rd四种命令使用方法
  8. Mac 技术篇-苹果笔记本休眠启动后WIFI连接转圈卡死置灰不可用解决方法,mac通过终端杀进程实例演示
  9. JavaScript技术篇 - js的null值判断,js的undefined的判断,js的null与undefined的2种区分方法
  10. JavaSript实现调用google地图输入经度,纬度移动到该点,同时对点做标记