目录

  1. ASP.NET MVC搭建项目后台UI框架—1、后台主框架
  2. ASP.NET MVC搭建项目后台UI框架—2、菜单特效
  3. ASP.NET MVC搭建项目后台UI框架—3、面板折叠和展开
  4. ASP.NET MVC搭建项目后台UI框架—4、tab多页签支持
  5. ASP.NET MVC搭建项目后台UI框架—5、Demo演示Controller和View的交互
  6. ASP.NET MVC搭建项目后台UI框架—6、客户管理(添加、修改、查询、分页)
  7. ASP.NET MVC搭建项目后台UI框架—7、统计报表
  8. ASP.NET MVC搭建项目后台UI框架—8、将View中选择的数据行中的部分数据传入到Controller中
  9. ASP.NET MVC搭建项目后台UI框架—9、服务器端排序

现在,有一个需求,我需要将表格中选中行的数据中的一部分传直接传到控制器中,然后保存到另外一张表中。一开始,我就想到在前台使用ajax构造json数据,然后控制器直接通过list接收。

选中界面中的行,然后点击“批量添加到月结表”,弹出一个对话框,这个对话框的月份列表为当前选择数据行中结账日期所在月份、以及前一个月和后一个月,选择月份后,将选择的月份,以及界面选中的行中的数据一起传到控制器中去。我发现网上很少有这种在前台构造复杂json,传递给控制器的,更多的是从控制器调用Json方法把后台数据转换为json格式,然后展示到前台,所以我就把实现方式记录下来,希望能够给大家提供参考。

控制器Reconciliation代码:

  1. /// <summary>
  2. /// 添加月结表
  3. /// </summary>
  4. /// <param name="no"></param>
  5. /// <param name="date"></param>
  6. /// <returns></returns>
  7. public ActionResult AddMonthPayOff(DateTime payOffDate)
  8. {
  9. ViewBag.PreMonthStr = payOffDate.AddMonths(-).Month + "月";
  10. ViewBag.MonthStr = payOffDate.Month + "月";
  11. ViewBag.NextMonthStr = payOffDate.AddMonths().Month + "月";
  12.  
  13. ViewBag.PreYearMonth = payOffDate.AddMonths(-);
  14. ViewBag.YearMonth = payOffDate;
  15. ViewBag.NextYearMonth = payOffDate.AddMonths();
  16. return View();
  17. }
  18.  
  19. /// <summary>
  20. /// 添加月结表
  21. /// </summary>
  22. /// <param name="data"></param>
  23. /// <param name="isNeglect">是否忽视异常</param>
  24. /// <returns></returns>
  25. [HttpPost]
  26. public JsonResult AddMonthPayOff(List<MonthPayOffModel> data, bool isNeglect, DateTime payOffMonth)
  27. {
  28. string message = string.Empty;
  29. var dealdata = data.Select(a => new MonthPayOffData()
  30. {
  31. MonthPayTime = payOffMonth,
  32. ReconcileTime = a.ReconcileTime,
  33. PreTotalCostFee = a.PreTotalCostFee,
  34. TotalCostFee = a.TotalCostFee,
  35. PreInComeFee = a.PreInComeFee,
  36. InComeFee = a.InComeFee,
  37. TotalMargin = a.TotalMargin,
  38. LoadBillBy = LoadBillInCome.GetByLoadBillNum(a.LoadBillNum)
  39. }).ToList();
  40. if (MonthPayOff.AddMonthPay(isNeglect, dealdata, payOffMonth, out message))
  41. {
  42. return Json(new { IsSuccess = true, Message = string.Format("共计:{0}个提单添加到月结", data.Count) });
  43. }
  44. else
  45. {
  46. return Json(new { IsSuccess = false, Message = message, IsPoint = message.Substring(, ) == "提醒" ? true : false });
  47. }
  48. }

视图AddMonthPayOff:

  1. @{
  2. ViewBag.Title = "AddMonthPayOff";
  3. Layout = null;
  4. }
  5. @Html.Raw(ViewBag.Msg)
  6. <script src="~/Scripts/jquery-1.8.3.min.js"></script>
  7. <link href="~/Content/main.css" rel="stylesheet" />
  8. <style type="text/css">
  9. table tr {
  10. height:24px;
  11. }
  12. </style>
  13. <script type="text/javascript">
  14. function selectpayMonth() {
  15. var list = $('input:radio[name="monthPayOff"]:checked').val();
  16. if (list == null) {
  17. return false;
  18. }
  19. else {
  20. frameElement.api.opener.postSelectData(list,false);
  21. }
  22. }
  23. </script>
  24.  
  25. @using (Html.BeginForm("AddMonthPayOff", "Reconciliation", FormMethod.Post, new { @clase = "form-inline", @role = "form", name = "from1" }))
  26. {
  27. <table style="text-align:center;width:190px;margin-top:10px;">
  28. <tr><td style="width:190px;"><input type="radio" name="monthPayOff" value="@ViewBag.PreYearMonth"/> @ViewBag.PreMonthStr</td></tr>
  29. <tr><td><input type="radio" name="monthPayOff" value="@ViewBag.YearMonth"/> @ViewBag.MonthStr</td></tr>
  30. <tr><td><input type="radio" name="monthPayOff" value="@ViewBag.NextYearMonth"/> @ViewBag.NextMonthStr</td></tr>
  31. <tr><td><input type="button" value="确定" onclick="selectpayMonth()" class="popbtn1 mg" style="text-align:center;margin:10px 0 10px 10px !important;">
  32. @*<input type="button" value="关闭" class="popbtn3 mg2" onclick="frameElement.api.opener.addDG.close();" />*@</td>
  33. </tr>
  34. </table>
  35. }

主界面视图LoadBill:这里主要记录选中的行数据,然后将其构造成json格式,通过ajax传递给控制器,注意这里构造的json数据,和控制器中对应的接收参数是一致的。

  1. //添加到月结表 提单号,结算月份、包裹数、总成本、总收入、总毛利
  2. function AddMonthlyBalance(id, date, ExpressCount, CostTotalFee, InComeTotalFee, GrossProfitRate) {
  3. if (date == '') {
  4. $.dialog.alert("提货单“"+id+"”数据未导入成本数据,且未清关");
  5. return false;
  6. }
  7. var d = { isNeglect: false, data: [{"LoadBillNum": id, "ReconcileTime": date, "PreTotalCostFee": CostTotalFee,"TotalCostFee": CostTotalFee,"PreInComeFee":
    InComeTotalFee,"InComeFee": InComeTotalFee,"TotalMargin": GrossProfitRate }] };
  8. selectData = JSON.stringify(d);
  9. addDG = $.dialog({
  10. id: 'AddMonthPayList',
  11. title: '添加到月结表',
  12. width: 200,
  13. height: 150,
  14. content: "url:/Reconciliation/AddMonthPayOff?payOffDate="+date,
  15. close: true,
  16. btnBar: false,
  17. max: false,
  18. min: false,
  19. lock: true
  20. })
  21. }

视图源码:

  1. @{
  2. ViewBag.Title = "提货单对账";
  3. }
  4. <link href="~/libs/DataTables-1.10.6/media/css/jquery.dataTablesNew.css" rel="stylesheet" />
  5. <script src="~/libs/DataTables-1.10.6/media/js/jquery.dataTables.min.js"></script>
  6. <script src="~/Scripts/DataTablesExt.js"></script>
  7. <script src="~/libs/My97DatePicker/WdatePicker.js"></script>
  8. <script type="text/javascript">
  9. var selectData; //选择行数据
  10. $(function () {
  11. var table = $("#table_local").dataTable({
  12. bProcessing: true,
  13. "scrollY": table_h,
  14. "scrollX": $(document).width(),
  15. "scrollCollapse": "true",
  16. "dom": 'tr<"bottom"lip><"clear">',
  17. "bServerSide": true, //指定从服务器端获取数据
  18. "iDisplayLength": 10,
  19. sServerMethod: "POST",
  20. showRowNumber:true,
  21. sAjaxSource: "@Url.Action("LoadBillList", "Reconciliation")",
  22. //"initComplete": function (data, args) {
  23. // //getTotal(args);
  24. // var arr = new Array(7,8,9,10,11,14,15,16,17,18); //页面一加载隐藏的列
  25. // controlColumnShow(table, arr,false);
  26. //},
  27. "fnServerParams": function (aoData) { //查询条件
  28. aoData.push(
  29. { "name": "CusName", "value": $("#CusName").val() },
  30. { "name": "LoadBillNum", "value": $("#LoadBillNum").val() },
  31. { "name": "CompletionSTime", "value": $("#CompletionSTime").val() },
  32. { "name": "CompletionETime ", "value": $("#CompletionETime").val() }
  33. );
  34. },
  35. //跟数组下标一样,第一列从0开始,这里表格初始化时,第四列默认降序
  36. "order": [[ 2, "asc" ]],
  37. columns: [
  38. {
  39. "data": "ID", orderable: false,width:"60",
  40. "render": function (data, type, row, meta) {
  41. return " <input id='cbx" + data + "' type='checkbox' onclick='controlSelectAll(" + data + ")' class='cbx' value='" + data + "'/> " + row.Index;
  42. }
  43. },
  44. { "data": "CusName" }, //客户名称
  45. { "data": "LoadBillNum" },//提单号
  46. { "data": "FeeWeight", orderable: false }, //提单包裹重量
  47. { "data": "ExpressCount", orderable: false }, //提单包裹数量
  48. { "data": "CompletionTime" }, //清关完成时间
  49. { "data": "GroundHandlingFee", visible: false },//邮政地勤费
  50. { "data": "CostStoreFee", visible: false },//邮政仓租
  51. {
  52. "data": "CostExpressFee", orderable: false, visible: false, "render": function (data, type, row, meta) {
  53. var css = "";
  54. if (row.IsReal==0) {
  55. css = " class='preColor'";
  56. }
  57. var re = "<div" + css + ">" + data + "</div>";
  58. return re;
  59. }
  60. },//邮政邮资
  61. {
  62. "data": "CostOperateFee", orderable: false, visible: false, "render": function (data, type, row, meta) {
  63. var css = "";
  64. if (row.IsReal == 0) {
  65. css = " class='preColor'";
  66. }
  67. var re = "<div" + css + ">" + data + "</div>";
  68. return re;
  69. }
  70. },//邮件处理费
  71. { "data": "CostOtherFee", visible: false },//邮政其他费用
  72. { "data": "CostTotalFee" },//邮政总成本
  73. { "data": "CostStatus" },//邮政结算状态
  74. { "data": "InComeLoadFee", visible: false },//客户提货费
  75. { "data": "InComeStoreFee", visible: false },//客户仓租
  76. { "data": "InComeExpressFee", visible: false },//客户运费
  77. { "data": "InComeOperateFee", visible: false },//客户操作费
  78. { "data": "InComeOtherFee", visible: false },//其他费用
  79. { "data": "InComeTotalFee" },//总收入
  80. { "data": "InComeStatus",orderable: false ,width:"90"},//结算状态
  81. {
  82. "data": "TotalGrossProfit", orderable: false, "render": function (data, type, row, meta) {
  83. var css = "";
  84. if (data < 0) {
  85. css=" class='numberColor'";
  86. }
  87. var re = "<div"+css+">"+data+"</div>";
  88. return re;
  89. }
  90. },//总毛利
  91. {
  92. "data": "GrossProfitRate", orderable: false, "render": function (data, type, row, meta) {
  93. var css = "";
  94. if (data < 0) {
  95. css = " class='numberColor'";
  96. }
  97. var re = "<div" + css + ">" + data + "%</div>";
  98. return re;
  99. }
  100. },//毛利率
  101. { "data": "Status",width: "120", orderable: false },//对账单状态
  102. {
  103. "data": "LoadBillNum", orderable: false, width: "160", "render": function (data, type, row, meta) {
  104. var re = "<div style='text-align:center'><a style='visibility:visible' onclick='openDetail(" + data + ")'>明细</a>&nbsp;&nbsp;";
  105. if (row.IsAddMonthPayOff == 0) {
  106. var reconcileDate = row.ReconcileDate == '' ? row.CompletionTime : row.ReconcileDate;
  107. re += "<a style='visibility:visible' name='addMonthPayOff' onclick='AddMonthlyBalance(\"" + data + "\",\"" + reconcileDate + "\","
  108. + row.ExpressCount + "," + row.CostTotalFee + "," + row.InComeTotalFee + "," + row.TotalGrossProfit + ")'>添加到月结表</a>";
  109. }
  110. return re+"</div>";
  111. }
  112. }//操作
  113. ],
  114. paging: true,//分页
  115. ordering: true,//是否启用排序
  116. searching: true,//搜索
  117. language: {
  118. "sProcessing": "处理中...",
  119. lengthMenu: '每页显示:<select class="form-control input-xsmall">' + '<option value="10">10</option>' + '<option value="20">20</option>' + '<option value="30">30</option>'
  120. + '<option value="50">50</option>' + '<option value="100">100</option>' + '<option value="150">150</option>' + '<option value="200">200</option>'
    + '<option value="250">250</option>',//左上角的分页大小显示。
  121. search: '<span class="label label-success">搜索:</span>',//右上角的搜索文本,可以写html标签
  122.  
  123. paginate: {//分页的样式内容。
  124. previous: "上一页",
  125. next: "下一页",
  126. first: "",
  127. last: ""
  128. },
  129.  
  130. zeroRecords: "暂无记录",//table tbody内容为空时,tbody的内容。
  131. //下面三者构成了总体的左下角的内容。
  132. info: "总共 <span class='pagesStyle'>(_PAGES_) </span>页,显示 _START_ -- _END_ ,共<span class='recordsStyle'> (_TOTAL_)</span> 条",//左下角的信息显示,大写的词为关键字。初始_MAX_ 条
  133. infoEmpty: "0条记录",//筛选为空时左下角的显示。
  134. infoFiltered: ""//筛选之后的左下角筛选提示,
  135. },
  136. pagingType: "full_numbers"//分页样式的类型
  137. });
  138. //new $.fn.dataTable.FixedColumns(table);
  139. //设置选中行样式
  140. $('#table_local tbody').on('click', 'tr', function () {
  141. if ($(this).hasClass('selected')) {
  142. $(this).removeClass('selected');
  143. }
  144. else {
  145. table.$('tr.selected').removeClass('selected');
  146. $(this).addClass('selected');
  147. }
  148. });
  149. //展开折叠列
  150. $("#imgIncome").click(function () {
  151. var url = $("#imgIncome").attr("src");
  152. var arr = new Array(8, 9, 10, 6,7);
  153. if (url == "/images/icon_9.png") {
  154. controlColumnShow(table, arr, true);
  155. $("#imgIncome").attr("src", "/images/icon_10.png");
  156. }
  157. else {
  158. controlColumnShow(table, arr, false);
  159. $("#imgIncome").attr("src", "/images/icon_9.png");
  160. }
  161.  
  162. });
  163. //收入展开折叠
  164. $("#imgCost").click(function () {
  165. var url = $("#imgCost").attr("src");
  166. var arr = new Array(14,15,16, 17, 13);
  167. if (url == "/images/icon_9.png") {
  168. controlColumnShow(table, arr, true);
  169. $("#imgCost").attr("src", "/images/icon_10.png");
  170. }
  171. else {
  172. controlColumnShow(table, arr, false);
  173. $("#imgCost").attr("src", "/images/icon_9.png");
  174. }
  175. });
  176. //获取批量选择行
  177. $("#btnAddMonthPayOffList").click(function () {
  178. var nTrs = table.fnGetNodes();//fnGetNodes获取表格所有行,nTrs[i]表示第i行tr对象
  179. var row;
  180. selectData = "{'data': [";
  181. var selectCounts = 0;
  182. var date;
  183. for (var i = 0; i < nTrs.length; i++) {
  184. if ($(nTrs[i])[0].cells[0].children[0].checked) {
  185. row = table.fnGetData(nTrs[i]);//fnGetData获取一行的数据
  186. selectCounts++;
  187. var tempdate = row.ReconcileDate == '' ? row.CompletionTime : row.ReconcileDate;
  188. if (tempdate == '') {
  189. $.dialog.alert("提货单“" + row.LoadBillNum + "”数据未导入成本数据,且未清关");
  190. return false;
  191. }
  192. //当时间不统一时,获取最大时间
  193. if (date == undefined || new Date(tempdate.replace("-", "/").replace("-", "/")) > new Date(date.replace("-", "/").replace("-", "/"))) {
  194. date = tempdate;
  195. }
  196. selectData += "{'LoadBillNum':'" + row.LoadBillNum + "','ReconcileTime':'" + tempdate + "','PreTotalCostFee':'" + row.CostTotalFee
  197. +"','TotalCostFee':'"+row.CostTotalFee+ "','PreInComeFee':'" + row.InComeTotalFee +"','InComeFee':'"+row.InComeTotalFee+ "','TotalMargin':'" + row.TotalGrossProfit + "'},";
  198. }
  199. }
  200. selectData = selectData.substring(0, selectData.length - 1)
  201. selectData += "]}";
  202. if (selectCounts < 1) {
  203. $.dialog.alert("请先选择要添加的数据行!");
  204. return false;
  205. }
  206. AddMonthlyBalanceList(date);
  207. });
  208. });
  209. function reloadList() {
  210. var tables = $('#table_local').dataTable().api();//获取DataTables的Api,详见 http://www.datatables.net/reference/api/
  211. tables.ajax.reload(function () {
  212. //var json = tables.context[0].json;
  213. //getTotal(json);
  214. }, false);
  215. }
  216. //统计
  217. function getTotal(json) {
  218. if (json) {
  219. if (json.TotalWeight) {
  220. $("#spnTotalWeight").html(json.TotalWeight);
  221. $("#spnTotalWayBillFee").html(json.TotalWayBillFee);
  222. $("#spnTotalProcessingFee").html(json.TotalProcessingFee);
  223. $("#spnTotalExpressFee").html(json.TotalExpressFee);
  224. $("#spnTotalOperateFee").html(json.TotalOperateFee);
  225. $("#spnSumWayBillProfit").html(json.SumWayBillProfit);
  226. $("#spnSumTotalProfit").html(json.SumTotalProfit);
  227. }
  228. }
  229. }
  230. //控制指定定列的隐藏和显示(table,列索引数组,隐藏or显示:true,false)
  231. function controlColumnShow(table, arr,tag) {
  232. for (var i = 0; i < arr.length; i++) {
  233. table.fnSetColumnVis(arr[i],tag);
  234. }
  235. }
  236. var addDG;
  237. var payOffMonth;
  238. //添加到月结表 提单号,结算月份、包裹数、总成本、总收入、总毛利
  239. function AddMonthlyBalance(id, date, ExpressCount, CostTotalFee, InComeTotalFee, GrossProfitRate) {
  240. if (date == '') {
  241. $.dialog.alert("提货单“"+id+"”数据未导入成本数据,且未清关");
  242. return false;
  243. }
  244. var d = { isNeglect: false, data: [{"LoadBillNum": id, "ReconcileTime": date, "PreTotalCostFee": CostTotalFee,"TotalCostFee": CostTotalFee,"PreInComeFee": InComeTotalFee,
    "InComeFee": InComeTotalFee,"TotalMargin": GrossProfitRate }] };
  245. selectData = JSON.stringify(d);
  246. addDG = $.dialog({
  247. id: 'AddMonthPayList',
  248. title: '添加到月结表',
  249. width: 200,
  250. height: 150,
  251. content: "url:/Reconciliation/AddMonthPayOff?payOffDate="+date,
  252. close: true,
  253. btnBar: false,
  254. max: false,
  255. min: false,
  256. lock: true
  257. })
  258. }
  259. //批量添加到月结表
  260. function AddMonthlyBalanceList(date) {
  261. addDG = $.dialog({
  262. id: 'AddMonthPay',
  263. title: '添加到月结表',
  264. width: 200,
  265. height: 150,
  266. content: "url:/Reconciliation/AddMonthPayOff?payOffDate=" + date,
  267. close: true,
  268. btnBar: false,
  269. max: false,
  270. min: false,
  271. lock: true
  272. })
  273. }
  274. //隐藏弹出框
  275. function hidePublishWin(msg, result, isStay) {
  276. var icon = "success.gif";
  277. if (result == "False") {
  278. icon = "error.gif";
  279. }
  280. $.dialog({
  281. title: "提示",
  282. icon: icon,
  283. titleIcon: 'lhgcore.gif',
  284. content: msg,
  285. lock: true,
  286. ok: true
  287. });
  288. if (result != "False") {
  289. if (addDG) {
  290. addDG.close();
  291. }
  292. if (isStay == 0) {
  293. reloadList();
  294. }
  295. else {
  296. reloadListNew();
  297. }
  298. }
  299. }
  300. //传递选择的行数据
  301. function postSelectData(payOffMonth, isNeglect) {
  302. //JSON.parse
  303. //var json = JSON.stringify(selectData);
  304. //var json = selectData;//JSON.parse(selectData);
  305. selectData = selectData.substring(0, selectData.length - 1) + ",'payOffMonth':'" + payOffMonth + "','isNeglect':"+isNeglect+"}";
  306. $.ajax({
  307. url: '/Reconciliation/AddMonthPayOff',
  308. type: 'POST',
  309. dataType: 'json',
  310. data: selectData,
  311. contentType: 'application/json; charset=utf-8',
  312. success: function (data) {
  313. if (isNeglect==false) {
  314. addDG.close();
  315. }
  316. if (!data.IsSuccess && data.IsPoint) {
  317. $.dialog.confirm(data.Message, function () { postSelectData(payOffMonth, true); });
  318. }
  319. else {
  320. $.dialog.alert(data.Message);
  321. }
  322. }
  323. });
  324. }
  325. </script>
  326. <div class="areabx clear">
  327. @using (Html.BeginForm("List", null, FormMethod.Get, new { @clase = "form-inline", @role = "form" }))
  328. {
  329. <div id="divSearch">
  330. @*<div class="areabx_header">@ViewBag.Title</div>*@
  331. <ul class="formod mgt10">
  332. <li><span>客户名:</span>@Html.TextBox("CusName","",new { @class = "trade-time wid153" })</li>
  333. <li><span>提单号:</span>@Html.TextBox("LoadBillNum","", new { @class = "trade-time" })</li>
  334. </ul>
  335. <ul class="formod mgt10">
  336. <li><span style="width:120px;">清关完成时间:</span>@Html.TextBox("CompletionSTime", "", new { @class = "trade-time wid153", @onClick = "WdatePicker({maxDate:'#F{$dp.$D(\\'CompletionETime\\')}'})" })</li>
  337. <li><span style="text-align:left;width:25px;margin-left:-20px;">—</span> @Html.TextBox("CompletionETime", "", new { @class = "trade-time wid153",
    @onClick = "WdatePicker({minDate:'#F{$dp.$D(\\'CompletionSTime\\')}'})" })</li>
  338. </ul>
  339. <div class="botbtbx pdb0">
  340. <input type="button" value="查询" id="btnSearch" onclick="reloadList();" class="btn btn-primary" />
  341. <input type="button" id="btnAddMonthPayOffList" value="批量添加到月结表" class="btn btn-primary"/>
  342. </div>
  343. </div>
  344. }
  345. <div class="tob_box mgt15">
  346. <table id="table_local" class="display" cellspacing="0" cellpadding="0" border="0" style="width: 100%;">
  347. <thead>
  348. <tr>
  349. <th rowspan="2"><input type='checkbox' id='chkAllColl' onclick='selectAll()' />序号</th>
  350. <th rowspan="2">客户简称</th>
  351. <th rowspan="2">提单号</th>
  352. <th rowspan="2">提单包裹重量(KG)</th>
  353. <th rowspan="2">提单包裹数量</th>
  354. <th rowspan="2">清关完成时间</th>
  355. <th colspan="7"><span>成本</span><span class="divIncome1"><img id="imgIncome" src="/images/icon_9.png" alt="收起/展开" title="收起/展开"/></span></th>
  356. <th colspan="7"><span>收入</span><span class="divIncome1"><img id="imgCost" src="/images/icon_9.png" alt="收起/展开" title="收起/展开"/></span></th>
  357. <th colspan="2">毛利</th>
  358. <th rowspan="2">对账单状态</th>
  359. <th rowspan="2">操作</th>
  360. </tr>
  361. <tr>
  362. <th>邮政地勤费</th>
  363. <th>邮政仓租</th>
  364. <th>邮政邮资</th>
  365. <th>邮件处理费</th>
  366. <th>邮政其他费用</th>
  367. <th>邮政总成本</th>
  368. <th>邮政结算状态</th>
  369. <th>客户提货费</th>
  370. <th>客户仓租</th>
  371. <th>客户运费</th>
  372. <th>客户操作费</th>
  373. <th>其他费用</th>
  374. <th>总收入</th>
  375. <th>结算状态</th>
  376. <th>总毛利</th>
  377. <th>毛利率</th>
  378. </tr>
  379. </thead>
  380. @*<tfoot>
  381. <tr>
  382. <td>总计</td>
  383. <td></td>
  384. <td></td>
  385. <td></td>
  386. <td></td>
  387. <td></td>
  388. <td><span id="spnTotalWeight"></span></td>
  389. <td><span id="spnTotalWayBillFee"></span></td>
  390. <td><span id="spnTotalProcessingFee"></span></td>
  391. <td></td>
  392. <td></td>
  393. <td></td>
  394. <td><span id="spnTotalExpressFee"></span></td>
  395. <td><span id="spnTotalOperateFee"></span></td>
  396. <td></td>
  397. <td></td>
  398. <td></td>
  399. <td><span id="spnSumWayBillProfit"></span></td>
  400. <td><span id="spnSumTotalProfit"></span></td>
  401. <td></td>
  402. <td></td>
  403. <td></td>
  404. </tr>
  405. </tfoot>*@
  406. </table>
  407. </div>
  408. </div>

MonthPayOffModel模型类:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5.  
  6. namespace Site.Models
  7. {
  8. public class MonthPayOffModel
  9. {
  10. /// <summary>
  11. /// 对账时间
  12. /// </summary>
  13. public DateTime ReconcileTime { get; set; }
  14. /// <summary>
  15. /// 预计总成本
  16. /// </summary>
  17. public decimal PreTotalCostFee{get;set;}
  18. /// <summary>
  19. /// 真实总成本
  20. /// </summary>
  21. public decimal TotalCostFee{get;set;}
  22. /// <summary>
  23. /// 预计总收入
  24. /// </summary>
  25. public decimal PreInComeFee{get;set;}
  26. /// <summary>
  27. /// 真实总收入
  28. /// </summary>
  29. public decimal InComeFee { get; set; }
  30. /// <summary>
  31. /// 总毛利
  32. /// </summary>
  33. public decimal TotalMargin { get; set; }
  34. /// <summary>
  35. /// 提单号
  36. /// </summary>
  37. public string LoadBillNum { get; set; }
  38. }
  39. }

js控制全选反选

  1. //监听每一行的复选框,控制全选、反选按钮
  2. function controlSelectAll(i) {
  3. var tblName, cbkAll; //Gridview ID ,全选框ID
  4. var tblName = "table_local";
  5. var cbkAll = "chkAllColl";
  6. var id = "#cbx" + i;
  7. //点击复选框选中行
  8. //if ($(id)[0].checked == true) {
  9. // $(id).parent().parent().addClass('selected');
  10. // $(id).parent().parent().siblings().removeClass('selected');
  11. //} else {
  12. // $(id).parent().parent().siblings().removeClass('selected');
  13. // $(id).parent().parent().removeClass('selected');
  14. //}
  15. var chks = getCheckbox(tblName);
  16. var count = 0;
  17. for (var i = 0; i < chks.length; i++) {
  18. if (chks[i].checked == true) {
  19. count++;
  20. }
  21. }
  22. if (count < chks.length) {
  23. document.getElementById(cbkAll).checked = false;
  24. }
  25. else {
  26. document.getElementById(cbkAll).checked = true;
  27. }
  28. }
  29. //全选反选
  30. function selectAll() {
  31. if ($("#chkAllColl").attr("checked")) {//如果全选的checkbox为选中状态时
  32. $("#table_local input").attr("checked", "checked");//其他的checkbox全部勾选
  33. //$("#table_local tbody tr").addClass('selected');
  34. }
  35. else {//如果全选的checkbox为选非中状态时
  36. $("#table_local input").attr('checked', false);//其他的checkbox全部取消勾选
  37. //$("#table_local tbody tr").removeClass('selected');
  38. }
  39. }

代码很多,不要被吓到了,其实也很简单,难点在在于如何构造json,然后让控制器自动接收并自动解析成List<Model>形式。这里用到了js的JSON.stringify(d)方法,注意json字符串里面的属性和值都加引号。

ASP.NET MVC搭建项目后台UI框架—8、将View中选择的数据行中的部分数据传入到Controller中的更多相关文章

  1. ASP.NET MVC搭建项目后台UI框架—1、后台主框架

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

  2. ASP.NET MVC搭建项目后台UI框架—11、自动加载下拉框查询

    ASP.NET MVC搭建项目后台UI框架—1.后台主框架 需求:在查询记录的时候,输入第一个字,就自动把以这个字开头的相关记录查找出来,输入2个字就过滤以这两个子开头的记录,依次类推. 突然要用到这 ...

  3. ASP.NET MVC搭建项目后台UI框架—2、菜单特效

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

  4. ASP.NET MVC搭建项目后台UI框架—3、面板折叠和展开

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

  5. ASP.NET MVC搭建项目后台UI框架—4、tab多页签支持

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

  6. ASP.NET MVC搭建项目后台UI框架—5、Demo演示Controller和View的交互

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

  7. ASP.NET MVC搭建项目后台UI框架—6、客户管理(添加、修改、查询、分页)

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

  8. ASP.NET MVC搭建项目后台UI框架—7、统计报表

    ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NET M ...

  9. ASP.NET MVC搭建项目后台UI框架—9、服务器端排序

    ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NET M ...

随机推荐

  1. SQL Server数据库sql语句生成器(SqlDataToScript)的使用(sql server自增列(id)插入固定值)

    SqlDataToScript是根据表数据进行生成 Insert Into语句,此工具还有一个好处是可以对自增列插入固定值,例如:自增的列id值为5,但是5这个行值已经删除,如果想存储Id自增列值为5 ...

  2. WCF学习之旅—WCF第二个示例(六)

    第五步,创建数据服务 在“解决方案资源管理器”中,使用鼠标左键选中“SCF.WcfService”项目,然后在菜单栏上,依次选择“项目”.“添加新项”. 在“添加新项”对话框中,选择“Web”节点,然 ...

  3. Python标准库的threading.Thread类(转自别人的翻译)

    这个类表示在单独的控制线程中运行的活动.有两种方法可以指定这种活动,给构造函数传递回调对象,或者在子类中重写run() 方法.其他方法(除了构造函数)都不应在子类中被重写.换句话说,在子类中只有__i ...

  4. 【原创】开源Math.NET基础数学类库使用(06)直接求解线性方程组

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  5. swift 的高阶函数的使用代码

    //: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...

  6. Javascript的无new构建

    看jquery源代码第一步的时候,对于jquery对象的创建就看的云里雾里,琢磨半天终于有点感觉了,在此记录下 第一种方式: var A = function(){ return A.prototyp ...

  7. ZOJ Problem Set - 1331 Perfect Cubes 判断一个double是否为整数

    zju对时间要求比较高,这就要求我们不能简单地暴力求解(三个循环搞定),就要换个思路:因为在循环时,已知a,确定b,c,d,在外重两层循环中已经给定了b和c,我们就不用遍历d,我们可以利用d^3=a^ ...

  8. ManagementClass类解析和C#如何获取硬件的相关信息

    在.NET的项目中,有时候需要获取计算机的硬件的相关信息,在C#语言中需要利用ManagementClass这个类来进行相关操作. 现在先来介绍一下ManagementClass类,首先看一下类的继承 ...

  9. ASP.NET通过递归添加树(Treeview)

    先来看看效果,基本上就是这样的. 所谓树,无非就是2点,第一个:根节点,第二:叶子节点,其中叶子节点中还可能有叶子节点,但是根节点始终只有一个. 下面贴上 各部分的代码 1.PAGE_LOAD载入事件 ...

  10. 去哪儿搜索引擎QSearch设计与实现

    本次演讲主要介绍的是QSearch的具体设计和应用场景,并分别解答以下几个问题:QSearch与开源垂直软件Lucene的区别:具体业务的实现技巧.以及QSearch的具体设计:如何通过Partial ...