迁移也没太大变化,有一个, 之前的Request.QueryString 是返回NameValueCollection, 现在则是返回整个字符串. 你要改成Request.Query[“key”]

直接上代码吧.

  1. @using FoxCRMCore
  2. @{
  3. var controller = "CRM/Announcement";
  4. ViewBag.Title = "公告信息";
  5. }
  6.  
  7. <script type="text/javascript" language="javascript">
  8.  
  9. $(function () {
  10.  
  11. $('#grid').datagrid({
  12. title: '@ViewBag.Title',
  13. iconCls: 'icon-blank',
  14. nowrap: false,
  15. striped: true,
  16. url: '/@controller/ListByPage',
  17. sortName: 'cDate',
  18. sortOrder: 'desc',
  19. remoteSort: true,
  20. fitColumns: true,
  21. fit: true,
  22. idField: 'id',
  23. frozenColumns: [[
  24. { field: 'id', checkbox: true, width: , sortable: true },
  25. { field: 'OPERATION', title: '编辑', width: , formatter:
  26. function (value, row, index) {
  27.  
  28. var edit = '<a href="/@controller/View/' + row.id + '">编辑</a> ';
  29. return edit;
  30. }
  31. }
  32. ]],
  33.  
  34. columns: [[
  35. { field: 'subject', title: '标题', width: , align: 'right', sortable: true },
  36. { field: 'contentDesc', title: '内容', width: , align: 'left', sortable: true },
  37. { field: 'cDate', title: '创建时间', width: , align: 'right', sortable: true },
  38. { field: 'modifyDate', title: '修改时间', width: , align: 'right', sortable: true },
  39. { field: 'isActive', title: '是否有效', width: , align: 'right', sortable: true }
  40. ]],
  41. onDblClickRow: function (index, data) {
  42. var row = $(this).datagrid('getRows')[index];
  43. window.location = "/@controller/View/" + row.id;
  44. },
  45. pagination: true,
  46. pageSize: ,
  47. rownumbers: true,
  48. toolbar: "#dlg-toolbar"
  49. });
  50.  
  51. $('#grid').datagrid('gotoPage', );
  52. });
  53.  
  54. //SearchBox传value过来,不能用$('#txtKey').val()
  55. function Search(value, name) {
  56. $('#grid').datagrid('load', { "key": "Air", "value": value });
  57. }
  58. function Add() {
  59. window.location = "/@controller/View/";
  60. }
  61. function Edit() {
  62.  
  63. var row = $('#grid').datagrid('getSelected');
  64. if (row) {
  65. window.location = "/@controller/View/" + row.id;
  66. }
  67. else {
  68. $.messager.alert('提示', '请选择要修改的数据');
  69. return;
  70. }
  71. }
  72. function Delete() {
  73. var rows = $('#grid').datagrid('getSelections');
  74. if (!rows || rows.length == ) {
  75. $.messager.alert('提示', '请选择要删除的数据');
  76. return;
  77. }
  78. var parm;
  79. $.each(rows, function (i, n) {
  80. if (i == ) {
  81. parm = "idList=" + n.id;
  82. }
  83. else {
  84. parm += "&idList=" + n.id;
  85. }
  86. });
  87. $.messager.confirm('提示', '是否删除这些数据?', function (r) {
  88. if (!r) {
  89. return;
  90. }
  91.  
  92. $.ajax({
  93. type: "POST",
  94. url: "/@controller/Delete/",
  95. data: parm,
  96. success: function (msg) {
  97. if (msg.IsSuccess) {
  98. $.messager.alert('提示', '删除成功!', "info", function () {
  99. $('#grid').datagrid("reload");
  100. });
  101. }
  102. },
  103. error: function () {
  104. $.messager.alert('错误', '删除失败!', "error");
  105. }
  106. });
  107. });
  108. }
  109.  
  110. </script>
  111.  
  112. <div region="center" style="padding: 5px;" border="false">
  113. <table id="grid">
  114. </table>
  115. </div>
  116. <div id="dlg-toolbar" style="padding: 2px 0;display:none">
  117. <table cellpadding="" cellspacing="" style="width: 100%">
  118. <tr>
  119. <td style="padding-left: 2px">
  120. <a id="btnSave" href="javascript:Add();" class="easyui-linkbutton" data-options="iconCls:'icon-add',plain:true">
  121. 添加</a> @*<a id="btnUpdate" href="javascript:Edit();" class="easyui-linkbutton" data-options="iconCls:'icon-save',plain:true">
  122. 修改</a> <a id="btnDelete" href="javascript:Delete();" class="easyui-linkbutton" data-options="iconCls:'icon-cut',plain:true">
  123. 删除</a>*@
  124. <input id="txtKey" class="easyui-searchbox" data-options="prompt:'请输入查询条件',searcher:Search" style="width: 250px" />
  125. </td>
  126. </tr>
  127. </table>
  128. </div>

列表页Index.csHtml

Controller的ListByPage 方法,给EASYUI 的datagrid 调用, 如果要把过滤条件,排序等动态传到LINQ,可以使用一个微软提供的DynamicQueryable,

https://blog.csdn.net/lee576/article/details/43666969

这个类在.net core需要修改一下.参考https://stackoverflow.com/questions/41784393/how-to-emit-a-type-in-net-core

  1. //AssemblyBuilder assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(name, AssemblyBuilderAccess.Run); //NET CORE 方法变了.
  2.  
  3. AssemblyBuilder assembly =AssemblyBuilder.DefineDynamicAssembly(new AssemblyName(Guid.NewGuid().ToString()), AssemblyBuilderAccess.Run);
  1.      /// <summary>
  2. ///Annoucement列表
  3. /// JQuery EasyUI datagrid分页的参数page, rows, order, sort
  4. /// </summary>
  5. /// <param name="page">页码</param>
  6. /// <param name="rows">每页条数</param>
  7. /// <param name="order">顺序/倒序 asc/desc</param>
  8. /// <param name="sort">排序字段</param>
  9. /// <param name="key">查找字段</param>
  10. /// <param name="value">查找值</param>
  11. /// <returns></returns>
  12. [ResponseCache(Duration = ,VaryByQueryKeys = new string[]{"key","page","rows"})]
  13. public ActionResult ListByPage(int page = , int rows = , string order = "",
  14. string sort = "ID", string key = "", string value = "")
  15. {
  16. //int total = 0;
  17. string orderBy = " order by "+ sort + " " + order;
  18. string filter = " where 1=1 ";
  19. if (!String.IsNullOrEmpty(value))
  20. filter += " and "+ key +" like '%" + value + "%'"; //like 操作
  21. string tableName = _context.Model
  22. .FindEntityType(typeof(Announcement).FullName)
  23. .Relational().TableName;
  24. string sql = "select * from "+ tableName + filter ;
  25.  
  26. var qry = _context.Announcements.FromSql(sql).OrderBy(sort+" "+ order);
  27. var list = qry.Skip((page-)* rows).Take(rows);
  28.  
  29. var result = new { total = qry.Count(), rows = list.ToList() };
  30.  
  31. return Json(result);
  32. }

当然列表页面可能有多种查询条件组合, 更灵活的方式是用Dapper, Dapper使用_context.Databae.GetDbConnect, 然后可以conn.Execute(sql),conn.ExecuteScalar(sql), conn.Query(sql)

  1. var conn = _context.Database.GetDbConnection();
  2.  
  3. var actions = conn.Query("exec [usp_search] @table_code = N'" + tableCode + "');
  4. var list = actions.Skip((page - ) * rows).Take(rows);
  5. var result = new { total = actions.Count(), rows = list.ToList() };
  6. //Dapper 返回的json格式Pascal格式,不是CamelCase
  7. return Json(result);

如果后台返回的json数据,有些是关联的对象,例如这样, 我们要显示department里的depName.

在JEasyUI的datagrid的column,就得这样写

  1. { field: 'department', title: '部门', width: , align: 'right', sortable: true, formatter: departmentFormatter },
  2.  
  3. function departmentFormatter(value) {
  4. return value.depName;
  5. }

Index,View,Save 方法

  1. public IActionResult Index()
  2. {
  3. //return View("../CRM/Announcement/Index");
  4. return View();
  5. }
  6. public IActionResult View(int? id)
  7. {
  8. Announcement entity = null;
  9. if (id != null)
  10. {
  11. entity = _context.Announcements.FirstOrDefault(tt => tt.ID.Equals(id));
  12. }
  13. if (entity == null)
  14. {
  15. entity = new Announcement();
  16. entity.IsActive = true;
  17. entity.CUser = ;
  18. entity.CDate = DateTime.Now;
  19. }
  20.  
  21. this.ViewBag.entity = entity;
  22.  
  23. return View();
  24. }
  25.  
  26. [HttpPost]
  27. public ActionResult Save(Announcement entity)
  28. {
  29. try
  30. {
  31. entity.ModifyDate = DateTime.Now;
  32. entity.ModifyUser = ; //TODO: replace with login user id
  33. _context.Attach(entity);
  34. //Attach之后,PrimaryKey存在的记录状态为unchaged, 不存在的记录状态为Added
  35. if(_context.Entry(entity).State== EntityState.Unchanged)
  36. _context.Entry(entity).State = EntityState.Modified;
  37. _context.SaveChanges();
  38. if (entity.ID > )
  39. return Json(new { isSuccess = true, message = "保存成功", entityId = entity.ID });
  40. else
  41. return Json(new { isSuccess = false, message = "保存失败" });
  42. }
  43. catch (Exception e)
  44. {
  45. //Response.Write(e.Message + e.StackTrace);
  46. return Json(new { isSuccess = true, message = "保存失败:" + e.Message });
  47. }
  48. }

datagird,某一页的记录,点击是跳到其他页面,我本来想做一个,跳到其他页面返回后, datagrid会记住之前的页码. 但datagrid好像默认都是显示第一页的.指定PageNumber也没用

就放弃了. 关键是EasyUI的界面中规中矩,不好看, 也说不出哪里难看. 我打算换一个UI, 再花时间在datagrid不划算.

上网找了一下,国内有layUI,fineUI,amazeUI 做的不错, 我个人比较喜欢amazeUI. 下次再换了.

easyui datagrid 导出excel,参考这个地方: https://blog.csdn.net/cc1314_/article/details/78810175

但他这个方法有2个bug,一个是utf8乱码, 另一个是把Frozen Column 也导出了,因为我的datagrid的Fronzen Column是Edit操作按钮,导出没意义.

修改如下:

  1. $.extend($.fn.datagrid.methods, {
  2. toExcel: function(jq, filename){
  3. return jq.each(function(){
  4. var uri = 'data:application/vnd.ms-excel;base64,'
  5. , template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><meta charset="utf-8"/><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table>{table}</table></body></html>'
  6. , base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))) }
  7. , format = function (s, c) { return s.replace(/{(\w+)}/g, function (m, p) { return c[p]; }) }
  8.  
  9. var alink = $('<a style="display:none"></a>').appendTo('body');
  10. var view = $(this).datagrid('getPanel').find('div.datagrid-view');
  11. //非冻结列的table body
  12. var table = view.find('div.datagrid-view2 table.datagrid-btable').clone();
  13.  
  14. //非冻结列的table header
  15. var head = view.find('div.datagrid-view2 table.datagrid-htable').clone();
  16. var hbody = head.find('>tbody');
  17.  
  18. hbody.prependTo(table);
  19.  
  20. var ctx = { worksheet: filename || 'Worksheet', table: table.html()||'' };
  21. alink[].href = uri + base64(format(template, ctx));
  22. alink[].download = filename;
  23. alink[].click();
  24. alink.remove();
  25. })
  26. }
  27. })

把旧系统迁移到.Net Core 2.0 日记(8) - EASYUI datagrid+ Dapper+ 导出Excel的更多相关文章

  1. 把旧系统迁移到.Net Core 2.0 日记 (15) --Session 改用Redis

    安装Microsoft.Extensions.Caching.Redis.Core NuGet中搜索Microsoft.Extensions.Caching.Redis.Core并安装,此NuGet包 ...

  2. 把旧系统迁移到.Net Core 2.0 日记(1) - Startup.cs 解析

    因为自己到开发电脑转到Mac Air,之前的Webform/MVC应用在Mac 跑不起来,而且.Net Core 2.0 已经比较稳定了. 1. 为什么会有跨平台的.Net Core  近年来,我们已 ...

  3. 把旧系统迁移到.Net Core 2.0 日记 (12) --发布遇到的问题

    1. 开发时是在Mac+MySql, 尝试发布时是在SQL2005+Win 2008 (第一版) 在Startup.cs里,数据库连接要改,分页时netcore默认是用offset关键字分页, 如果用 ...

  4. 把旧系统迁移到.Net Core 2.0 日记 (17) --多租户和SoftDelete

    在EF Core 2.0版本中出现了全局过滤新特性即HasQueryFilter,它出现的意义在哪里?能够解决什么问题呢? 通过HasQueryFilter方法来创建过滤器能够允许我们对访问特定数据库 ...

  5. 把旧系统迁移到.Net Core 2.0 日记(10) -- EF core 和之前版本多对多映射区别

    EF Core 现在不支持多对多映射,只能做2个一对多映射. 比如Product和Category 我现在定义Product和Category是多对多关系. 那么实体定义如下: public clas ...

  6. 把旧系统迁移到.Net Core 2.0 日记 (18) --JWT 认证(Json Web Token)

    我们最常用的认证系统是Cookie认证,通常用一般需要人工登录的系统,用户访问授权范围的url时,会自动Redirect到Account/Login,登录后把认证结果存在cookie里. 系统只要找到 ...

  7. 把旧系统迁移到.Net Core 2.0 日记(5) Razor/HtmlHelper/资源文件

    net core 的layout.cshtml文件有变化, 区分开发环境和非开发环境. 开发环境用的是非压缩的js和css, 正式环境用压缩的js和css <environment includ ...

  8. 把旧系统迁移到.Net Core 2.0 日记(4) - 使用EF+Mysql

    因为Mac 不能装SqlServer, 所以把数据库迁移到MySql,然后EntityFramework要改成Pomelo.EntityFrameworkCore.MySql 数据库迁移时,nvarc ...

  9. 把旧系统迁移到.Net Core 2.0 日记(3) - 详解依赖注入 (转)

    关于DI 依赖注入, 转载这篇文章, 写得很好的. ----------------------------- DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关 ...

随机推荐

  1. 八皇后问题 递归实现 C语言 超详细 思路 基础

    八皇后问题 :假设 將八个皇后放到国际象棋盘上,使其两两之间无法相互攻击.共有几种摆法? 基础知识: 国际象棋里,棋盘为8X8格. 皇后每步可以沿直线.斜线 走任意格. 思路: 1.想把8个皇后放进去 ...

  2. hdu 5120 Intersection 两个圆的面积交

    Intersection Time Limit: 4000/4000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) P ...

  3. 数据库备份出现警告:Warning: Using a password on the command line interface can be insecure. Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even thos

    1.先来看原备份数据库语句: mysqldump -h 127.0.0.1 -uroot -ppassword database > /usr/microStorage/dbbackup/cap ...

  4. Mysql 查看定时器 打开定时器 设置定时器时间

    1.查看是否开启evevt与开启evevt. 1.1.MySQL evevt功能默认是关闭的,可以使用下面的语句来看evevt的状态,如果是OFF或者0,表示是关闭的. show VARIABLES ...

  5. [转]VS中的路径宏 OutDir、ProjectDir、SolutionDir各种路径含义

    转自 http://blog.csdn.net/restraint/article/details/39934401 说明 $(RemoteMachine) 设置为“调试”属性页上“远程计算机”属性的 ...

  6. python3.5学习第二章(1)标准库,bytes

    一.输出python库的路径: 1.sys标准库 import sysprint(sys.path) 结果: 'E:\\python练习\\python35学习\\Day2', 'E:\\python ...

  7. EOJ Monthly 2018.11 D. 猜价格

    猜价格 分两种情况讨论: k≤n,先猜至多 k 次 1,由于回答 <1 肯定是假的,所以可以把剩余系下是哪次错试出来,然后用至多 n 次搞定. k>n,每个数都猜两次,如果两次结果不一样, ...

  8. Python Appium 元素定位方法简单介绍

    Python  Appium  元素定位 常用的八种定位方法(与selenium通用) # id定位 driver.find_element_by_id() # name定位 driver.find_ ...

  9. html5 history 信息api pushState

    这个功能可以进行传参,还可以解决ajax无法前进和倒退的问题 首先,history新增的两个方法history.replaceState()和history.pushState()方法属于HTML5浏 ...

  10. 非常好的一个CentOS 6.2 apache 2.4.2 编译教程

    除了以下2点,没有错的. 1)pcre-devel 需要安装 2)apr 和 apr-util 有了新的版本了 How to Install Apache 2.4.2 from Source on C ...