首先创建一个控制器,右击Controllers—>添加控制器,选择第一个
价格:
公司列表:@Html.DropDownList("Company", ViewBag.Company as IEnumerable)
状态:@Html.DropDownList("DrinksTypeSelect", ViewBag.DrinksTypeSelect as IEnumerable)
查询
我们要显示列表并且添加Easyui的各个样式,这时候我们需要用到的js包和Easyui的样式包,最下边那个包是专门处理时间格式的,我把代码贴到下边,童鞋们可以自行到官网下载Easyui 的包,我这里 把样式包复制到Web层的Content的文件下了。js包是在Web上添加nuget的jquery的包,我的版本是1.11.1,
以下就是Tookit的代码包,专门转换时间格式,童鞋们可以直接拿来用,自行下载找不到的可以在Script文件下添加一个名称为Tookit的javascript的包,并把下边的代码搬过去就可以了
//格式化JSON时间
function FormatJsonTime(date) {
if (date != null) {
var de = new Date(parseInt(date.replace("/Date(", "").replace(")/", "").split("+")[0]));
var y = de.getFullYear();
var m = de.getMonth() + 1;
var d = de.getDate();
var h = de.getHours();
var mi = de.getMinutes();
var s = de.getSeconds();
return y + '-' + (m < 10 ? ('0' + m) : m) + '-' + (d < 10 ? ('0' + d) : d) + ' ' + (h < 10 ? ('0' + h) : h) + ':' + (mi < 10 ? ('0' + mi) : mi) + ':' + (s < 10 ? ('0' + s) : s);
}
else {
return "";
}
}
//格式化日期
function FormatJsonDate(date) {
if (date != null) {
var de = new Date(parseInt(date.replace("/Date(", "").replace(")/", "").split("+")[0]));
var y = de.getFullYear();
var m = de.getMonth() + 1;
var d = de.getDate();
return y + '-' + (m < 10 ? ('0' + m) : m) + '-' + (d < 10 ? ('0' + d) : d);
}
else {
return "";
}
}
我们要显示列表,就要写方法来处理数据,我们首先在控制器中创建一个新的方法
///
/// 饮料列表展示方法接口
///
///
///
public ActionResult GetPagedDrinksList(GetPagedDrinksListViewModel viewmodel)
{
}
GetPagedDrinksListViewModel 这个类是在Entity类中的ViewModel文件中创建的类,这个类中的数据是进行前台和后台交互的中间类该类中的数据基本上和数据库中字段相等,字段我们都用用到,最下边的两个数据就是分页查询用到的字段
///
/// 饮料数据访问类
///
public class GetPagedDrinksListViewModel
{
///
/// 饮料主键
///
public int d_ID { get; set; }
///
/// 饮料名称
///
public string d_Name { get; set; }
///
/// 饮料价格
///
public float d_Price { get; set; }
///
/// 饮料产地
///
public string d_Address { get; set; }
///
/// 生产日期
///
public DateTime d_Manufacture { get; set; }
///
/// 保质期
///
public string d_Expiration { get; set; }
///
/// 公司id
///
public int d_Company { get; set; }
///
/// 是否删除
///
public int d_IsDelete { get; set; }
///
/// 当前页数
///
public int page { get; set; }
///
/// 页大小
///
public int rows { get; set; }
}
交互类写完之后,我们在业务逻辑层开始写,这个就是分页显示方法,其中我又加了一些新的类文件,我依次贴给你们,请向下边看其中有这个几个
1,PredicateExtensions ——>进行查询业务处理的逻辑类,我也是抢过来的
2,DrinksListViewModel ——>展示给用户看的一个类
3,OperateResult ——>保存结果状态的类,例如查询成功,查询失败等结果
4,DataGridViewModel ——>分页查询的两个数据
这个贴的是drinksServers的业务逻辑类
///
/// 分页查询及列表显示
///
///
///
public OperateResult GetPagedDrinksList(GetPagedDrinksListViewModel viewModel)
{
//总记录数
int rowCount = 0;
//1.当用户什么都没有输入的时候默认查询所有的
var query = PredicateExtensions.True();
//2.根据用户输入的参数信息进行多条件查询
if (!string.IsNullOrWhiteSpace(viewModel.d_Name)) //根据饮料名称
query = query.And(e => e.d_Name.Contains(viewModel.d_Name));
if (viewModel.d_Price > 0) //根据饮料价格
query = query.And(e => e.d_Price == viewModel.d_Price);
if (viewModel.d_IsDelete >0) //是否删除
query = query.And(e => e.d_IsDelete == viewModel.d_IsDelete);
if (viewModel.d_Company > 0) //公司
query = query.And(e => e.d_Company == viewModel.d_Company);
var pagedData = GetPageList(viewModel.page, viewModel.rows, ref rowCount, query, e => e.d_ID, true)
.Select(e => new DrinksListViewModel()
{
d_ID = e.d_ID,
d_Name = e.d_Name,
d_Price = (float)e.d_Price,
d_Address = e.d_Address,
d_Manufacture = (DateTime)e.d_Manufacture,
d_Expiration = e.d_Expiration,
d_Company = (int)e.d_Company,
d_CompanyName = e.Company.c_Name,
d_IsDelete = ((DeleteState)e.d_IsDelete).ToString()
})
.ToList();
var dataGridViewModel = new DataGridViewModel() { total = rowCount, rows = pagedData };
return new OperateResult(ResultStatus.Success, "", dataGridViewModel);
}
PredicateExtensions这个类,小编的水平只知道怎么用,并不知道里边的逻辑,哪位博主知道的可以留言给小编,让小编也进一步学习
///
/// ParameterExpression
///
internal class ParameterReplacer : ExpressionVisitor
{
public ParameterReplacer(ParameterExpression paramExpr)
{
this.ParameterExpression = paramExpr;
}
public ParameterExpression ParameterExpression { get; private set; }
public Expression Replace(Expression expr)
{
return this.Visit(expr);
}
protected override Expression VisitParameter(ParameterExpression p)
{
return this.ParameterExpression;
}
}
public static class PredicateExtensions
{
public static Expression<Func> True() { return f => true; }
public static Expression<Func> False() { return f => false; }
public static Expression<Func> And(this Expression<Func> exp_left, Expression<Func> exp_right)
{
var candidateExpr = Expression.Parameter(typeof(T), "candidate");
var parameterReplacer = new ParameterReplacer(candidateExpr);
var left = parameterReplacer.Replace(exp_left.Body);
var right = parameterReplacer.Replace(exp_right.Body);
var body = Expression.And(left, right);
return Expression.Lambda<Func>(body, candidateExpr);
}
public static Expression<Func> Or(this Expression<Func> exp_left, Expression<Func> exp_right)
{
var candidateExpr = Expression.Parameter(typeof(T), "candidate");
var parameterReplacer = new ParameterReplacer(candidateExpr);
var left = parameterReplacer.Replace(exp_left.Body);
var right = parameterReplacer.Replace(exp_right.Body);
var body = Expression.Or(left, right);
return Expression.Lambda<Func>(body, candidateExpr);
}
}
DrinksListViewModel这个类文件跟上边那个非常相似,不过为了更好的区别,小编的这个类写的是用来显示给用户看的一个类
//饮料列表显示类
public class DrinksListViewModel
{
///
/// 饮料主键
///
public int d_ID { get; set; }
///
/// 饮料名称
///
public string d_Name { get; set; }
///
/// 饮料价格
///
public float d_Price { get; set; }
///
/// 饮料产地
///
public string d_Address { get; set; }
///
/// 生产日期
///
public DateTime d_Manufacture { get; set; }
///
/// 保质期
///
public string d_Expiration { get; set; }
///
/// 公司id
///
public int d_Company { get; set; }
///
/// 公司名字
///
public string d_CompanyName { get; set; }
///
/// 是否删除
///
public string d_IsDelete { get; set; }
}
OperateResult这个类是用来保存处理结果的状态信息
public enum ResultStatus
{
Error = -1,
Success = 1
}
///
/// 保存处理结果及提示信息
///
public class OperateResult
{
///
/// 结果状态
///
public ResultStatus ResultStatus { get; set; }
///
/// 消息提示
///
public string Msg { get; set; }
///
/// 数据
///
public object Data { get; set; }
public OperateResult(ResultStatus resultStatus, string msg)
{
this.ResultStatus = resultStatus;
this.Msg = msg;
}
public OperateResult(ResultStatus resultStatus, string msg, object data)
{
this.ResultStatus = resultStatus;
this.Msg = msg;
this.Data = data;
}
}
DataGridViewModel这个类中保存的是分页需要的两个数据
///
/// 分页查询需要的数据
///
public class DataGridViewModel
{
public int total { get; set; }
public object rows { get; set; }
}
现在业务逻辑都处理完了,只剩下返回到控制器,然后到视图了,
///
/// 饮料列表展示方法接口
///
///
///
public ActionResult GetPagedDrinksList(GetPagedDrinksListViewModel viewmodel)
{
var result = _drinksServers.GetPagedDrinksList(viewmodel);
return Json(result.Data);
}
我们只需要在控制器中调用我们上边写的业务逻辑类回调的数据进行转换后可以显示到界面了
我们接下来开始在界面通过 Easyui和javascript来处理
$(function () {
$("#dg_Drinks").datagrid({
fitColumns: true, //使列自动展开/收缩到合适的DataGrid宽度。
toolbar: "#tb", //toolbar:通过选择器指定的工具栏。
pagination: true, //pagination:如果为true,则在DataGrid控件底部显示分页工具栏。
fit: false, //fit:当设置为true的时候面板大小将自适应父容器。
singleSelect: true, //如果为true,则只允许选择一行。
rownumbers: true, //如果为true,则显示一个行号列。
url: "/Drinks/GetPagedDrinksList", //url:设置能够返回JSON数据的Action所对应的路径,控制器下的action方法,千万不要错,不然报404错误
columns: [[
{ field: 'd_ID', title: '饮料主键', width: 222, align: "center", },
{ field: 'd_Name', title: '饮料名称', width: 222, align: "center", },
{ field: 'd_Price', title: '饮料价格', width: 222, align: "center", },
{ field: 'd_Address', title: '饮料产地', width: 322, align: "center", },
{ field: 'd_Expiration', title: '保质期', width: 222, align: "center", },
{ field: 'd_CompanyName', title: '公司名称', width: 222, align: "center", },
{
field: 'd_Manufacture', title: '生产日期', width: 222, align: "center", formatter: function (value, row, index) {
return FormatJsonTime(row.d_Manufacture);
}
},
{ field: 'd_IsDelete', title: '是否删除', width: 222, align: "center", }
]]
});
//多条件搜索查询
$("#btn_Search").click(function () {
$("#dg_Drinks").datagrid("load", {
d_Name: $.trim($("#txt_Name").val()),
d_Price: $.trim($("#txt_Price").val()),
d_Company: $.trim($("#Company").val()),
d_IsDelete: $("#DrinksTypeSelect").val()
});
});
});
上边columns的属性中的field字段要跟饮料显示列表类中的字段保持一致这样数据就会过来,下边看一下我们列表和查询的最终结果
原创文章 11获赞 21访问量 539
关注
私信
展开阅读全文
作者:小生一枚