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

直接上代码吧.

 @using FoxCRMCore
@{
var controller = "CRM/Announcement";
ViewBag.Title = "公告信息";
} <script type="text/javascript" language="javascript"> $(function () { $('#grid').datagrid({
title: '@ViewBag.Title',
iconCls: 'icon-blank',
nowrap: false,
striped: true,
url: '/@controller/ListByPage',
sortName: 'cDate',
sortOrder: 'desc',
remoteSort: true,
fitColumns: true,
fit: true,
idField: 'id',
frozenColumns: [[
{ field: 'id', checkbox: true, width: , sortable: true },
{ field: 'OPERATION', title: '编辑', width: , formatter:
function (value, row, index) { var edit = '<a href="/@controller/View/' + row.id + '">编辑</a> ';
return edit;
}
}
]], columns: [[
{ field: 'subject', title: '标题', width: , align: 'right', sortable: true },
{ field: 'contentDesc', title: '内容', width: , align: 'left', sortable: true },
{ field: 'cDate', title: '创建时间', width: , align: 'right', sortable: true },
{ field: 'modifyDate', title: '修改时间', width: , align: 'right', sortable: true },
{ field: 'isActive', title: '是否有效', width: , align: 'right', sortable: true }
]],
onDblClickRow: function (index, data) {
var row = $(this).datagrid('getRows')[index];
window.location = "/@controller/View/" + row.id;
},
pagination: true,
pageSize: ,
rownumbers: true,
toolbar: "#dlg-toolbar"
}); $('#grid').datagrid('gotoPage', );
}); //SearchBox传value过来,不能用$('#txtKey').val()
function Search(value, name) {
$('#grid').datagrid('load', { "key": "Air", "value": value });
}
function Add() {
window.location = "/@controller/View/";
}
function Edit() { var row = $('#grid').datagrid('getSelected');
if (row) {
window.location = "/@controller/View/" + row.id;
}
else {
$.messager.alert('提示', '请选择要修改的数据');
return;
}
}
function Delete() {
var rows = $('#grid').datagrid('getSelections');
if (!rows || rows.length == ) {
$.messager.alert('提示', '请选择要删除的数据');
return;
}
var parm;
$.each(rows, function (i, n) {
if (i == ) {
parm = "idList=" + n.id;
}
else {
parm += "&idList=" + n.id;
}
});
$.messager.confirm('提示', '是否删除这些数据?', function (r) {
if (!r) {
return;
} $.ajax({
type: "POST",
url: "/@controller/Delete/",
data: parm,
success: function (msg) {
if (msg.IsSuccess) {
$.messager.alert('提示', '删除成功!', "info", function () {
$('#grid').datagrid("reload");
});
}
},
error: function () {
$.messager.alert('错误', '删除失败!', "error");
}
});
});
} </script> <div region="center" style="padding: 5px;" border="false">
<table id="grid">
</table>
</div>
<div id="dlg-toolbar" style="padding: 2px 0;display:none">
<table cellpadding="" cellspacing="" style="width: 100%">
<tr>
<td style="padding-left: 2px">
<a id="btnSave" href="javascript:Add();" class="easyui-linkbutton" data-options="iconCls:'icon-add',plain:true">
添加</a> @*<a id="btnUpdate" href="javascript:Edit();" class="easyui-linkbutton" data-options="iconCls:'icon-save',plain:true">
修改</a> <a id="btnDelete" href="javascript:Delete();" class="easyui-linkbutton" data-options="iconCls:'icon-cut',plain:true">
删除</a>*@
<input id="txtKey" class="easyui-searchbox" data-options="prompt:'请输入查询条件',searcher:Search" style="width: 250px" />
</td>
</tr>
</table>
</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

//AssemblyBuilder assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(name, AssemblyBuilderAccess.Run);  //NET CORE 方法变了.

AssemblyBuilder assembly =AssemblyBuilder.DefineDynamicAssembly(new AssemblyName(Guid.NewGuid().ToString()), AssemblyBuilderAccess.Run);
      /// <summary>
///Annoucement列表
/// JQuery EasyUI datagrid分页的参数page, rows, order, sort
/// </summary>
/// <param name="page">页码</param>
/// <param name="rows">每页条数</param>
/// <param name="order">顺序/倒序 asc/desc</param>
/// <param name="sort">排序字段</param>
/// <param name="key">查找字段</param>
/// <param name="value">查找值</param>
/// <returns></returns>
[ResponseCache(Duration = ,VaryByQueryKeys = new string[]{"key","page","rows"})]
public ActionResult ListByPage(int page = , int rows = , string order = "",
string sort = "ID", string key = "", string value = "")
{
//int total = 0;
string orderBy = " order by "+ sort + " " + order;
string filter = " where 1=1 ";
if (!String.IsNullOrEmpty(value))
filter += " and "+ key +" like '%" + value + "%'"; //like 操作
string tableName = _context.Model
.FindEntityType(typeof(Announcement).FullName)
.Relational().TableName;
string sql = "select * from "+ tableName + filter ; var qry = _context.Announcements.FromSql(sql).OrderBy(sort+" "+ order);
var list = qry.Skip((page-)* rows).Take(rows); var result = new { total = qry.Count(), rows = list.ToList() }; return Json(result);
}

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

            var conn = _context.Database.GetDbConnection();

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

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

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

{ field: 'department', title: '部门', width: , align: 'right', sortable: true, formatter: departmentFormatter },

    function departmentFormatter(value) {
return value.depName;
}

Index,View,Save 方法

        public IActionResult Index()
{
//return View("../CRM/Announcement/Index");
return View();
}
public IActionResult View(int? id)
{
Announcement entity = null;
if (id != null)
{
entity = _context.Announcements.FirstOrDefault(tt => tt.ID.Equals(id));
}
if (entity == null)
{
entity = new Announcement();
entity.IsActive = true;
entity.CUser = ;
entity.CDate = DateTime.Now;
} this.ViewBag.entity = entity; return View();
} [HttpPost]
public ActionResult Save(Announcement entity)
{
try
{
entity.ModifyDate = DateTime.Now;
entity.ModifyUser = ; //TODO: replace with login user id
_context.Attach(entity);
//Attach之后,PrimaryKey存在的记录状态为unchaged, 不存在的记录状态为Added
if(_context.Entry(entity).State== EntityState.Unchanged)
_context.Entry(entity).State = EntityState.Modified;
_context.SaveChanges();
if (entity.ID > )
return Json(new { isSuccess = true, message = "保存成功", entityId = entity.ID });
else
return Json(new { isSuccess = false, message = "保存失败" });
}
catch (Exception e)
{
//Response.Write(e.Message + e.StackTrace);
return Json(new { isSuccess = true, message = "保存失败:" + e.Message });
}
}

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操作按钮,导出没意义.

修改如下:

    $.extend($.fn.datagrid.methods, {
toExcel: function(jq, filename){
return jq.each(function(){
var uri = 'data:application/vnd.ms-excel;base64,'
, 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>'
, base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))) }
, format = function (s, c) { return s.replace(/{(\w+)}/g, function (m, p) { return c[p]; }) } var alink = $('<a style="display:none"></a>').appendTo('body');
var view = $(this).datagrid('getPanel').find('div.datagrid-view');
//非冻结列的table body
var table = view.find('div.datagrid-view2 table.datagrid-btable').clone(); //非冻结列的table header
var head = view.find('div.datagrid-view2 table.datagrid-htable').clone();
var hbody = head.find('>tbody'); hbody.prependTo(table); var ctx = { worksheet: filename || 'Worksheet', table: table.html()||'' };
alink[].href = uri + base64(format(template, ctx));
alink[].download = filename;
alink[].click();
alink.remove();
})
}
})

把旧系统迁移到.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. mongdb使用技巧

    进入shell的方法:mongo 命令   # 使用系统服务启动 mongodb /etc/init.d/mongod # 或 service mongod start # 或 service mon ...

  2. 《深入理解JVM虚拟机》读书笔记

    前言:<深入理解JVM虚拟机>是JAVA的经典著作之一,因为内容更偏向底层,所以之前一直没有好好的阅读过.最近因为刚好有空,又有了新目标.所以打算和<构架师的12项修炼>一起看 ...

  3. 快排+java实现

    import java.util.Arrays; public class QuickSort { //三数取中法.取出不大不小的那个位置 public static int getPivotPos( ...

  4. dockerfile debian 和pip使用国内源

    python官方镜像是基于debian的.国内使用时定制一下,加快下载速度. 1 debian本身使用国内源 dockfile中: #国内debian源 ADD sources.list /etc/a ...

  5. 分散的配置文件VS集中的注册表

    假设有这样一个工程,是这样设计的: 1整个软件.服务被切分为 由若干独立的多道程序(多个进程/微服务): 2 这些多道程序只是“机制mechanism”,而“策略strategy”写在各自用到的配置文 ...

  6. 从flask视角理解angular(二)Blueprint VS Component

    Component类似flask app下面的每个blueprint. import 'rxjs/add/operator/switchMap'; import { Component, OnInit ...

  7. Codeforces 995 E - Number Clicker

    E - Number Clicker 思路:双向搜索 代码: #include<bits/stdc++.h> using namespace std; #define fi first # ...

  8. 通过AndroidSDK自带的Tool在dos命令行窗口显示日志,并存入txt文档中

    1.在默认情况下,命令行窗口中使用的代码页是中文或者美国的,即编码是中文字符集或者西文字符集.  如果一个文本文件是utf-8的,那么在dos窗口中不能正确显示文件中的内容. 以下命令切换编码: ch ...

  9. django-simple-captcha 验证码插件介绍 django-simple-captcha 使用 以及添加动态ajax刷新验证

    django-simple-captcha作为一款django的验证码插件,使用方法非常简单,能够快速应用到web应用中. 文档官网地址:django-simple-captcha 参考博客:http ...

  10. 概率分布之间的推导关系 | Univariate Distribution Relationships

    Univariate Distribution Relationships APPL: A Probability Programming Language Maplesoft- Software f ...