MVC三层

  1. 创建Service层、IService层、DTO层
  2. Service层中创建Entities文件夹,存放EF文件。在Entities文件夹中建立BaseEntity类,创建BaseService类,设置泛型,并且设置规则,泛型继承BaseEntities类,(IService中的类:IServiceSupport)
  3. BaseService中的代码:
    public class BaseService<T> where T : BaseEntity
        {
            private OAT db;
            public BaseService(OAT db)
            {
                this.db = db;
            }
            /// <summary>
            /// 添加
            /// </summary>
            /// <param name="entity"></param>
            /// <returns></returns>
            public bool Add(T entity)
            {
                db.Entry<T>(entity).State = EntityState.Added;
                return db.SaveChanges() > 0;
            }
            /// <summary>
            /// 修改
            /// </summary>
            /// <param name="entity"></param>
            /// <returns></returns>
            public bool Update(T entity)
            {
                db.Set<T>().Attach(entity);
                db.Entry<T>(entity).State = EntityState.Modified;
                return db.SaveChanges() > 0;
            }
            /// <summary>
            /// 删除
            /// </summary>
            /// <param name="entity"></param>
            /// <returns></returns>
            public bool Delete(T entity)
            {
                db.Set<T>().Attach(entity);
                db.Entry<T>(entity).State = EntityState.Deleted;
                return db.SaveChanges() > 0;
            }
            /// <summary>
            /// 查询所有
            /// </summary>
            /// <param name="predicate"></param>
            /// <returns></returns>
            public IQueryable<T> GetLists(Expression<Func<T, bool>> predicate)
            {
                return db.Set<T>().Where(predicate);
            }
            /// <summary>
            /// 查询单条数据
            /// </summary>
            /// <param name="predicate"></param>
            /// <returns></returns>
            public T Get(Expression<Func<T, bool>> predicate)
            {
                return GetLists(predicate).FirstOrDefault();
            }
            /// <summary>
            /// 排序
            /// </summary>
            /// <typeparam name="TKey"></typeparam>
            /// <param name="predicate"></param>
            /// <param name="orderBy"></param>
            /// <param name="isAsc"></param>
            /// <returns></returns>
            public IQueryable<T> GetList<TKey>(Expression<Func<T, bool>> predicate, Expression<Func<T, TKey>> orderBy, bool isAsc = true)
            {
                if (!isAsc)
                {
                    return GetLists(predicate).OrderBy(orderBy);
                }
                else
                {
                    return GetLists(predicate).OrderByDescending(orderBy);
                }
            }
            /// <summary>
            /// 分页
            /// </summary>
            /// <typeparam name="TKey"></typeparam>
            /// <param name="Start"></param>
            /// <param name="PageSize"></param>
            /// <param name="RowCount"></param>
            /// <param name="predicate"></param>
            /// <param name="orderBy"></param>
            /// <param name="isAsc"></param>
            /// <returns></returns>
            public IQueryable<T> GetPagedList<TKey>(int Start, int PageSize, ref int RowCount, Expression<Func<T, bool>> predicate, Expression<Func<T, TKey>> orderBy, bool isAsc = true)
            {
                RowCount = GetLists(predicate).Count();
                Start = Start < 1 ? 0 : Start;
                if (!isAsc)
                {
                    return GetLists(predicate).OrderBy(orderBy).Skip(Start).Take(PageSize);
                }
                else
                {
                    return GetLists(predicate).OrderByDescending(orderBy).Skip(Start).Take(PageSize);
                }
            }
            public static Expression<Func<T, object>> GetSortLambda<T>(string propertyPath)
            {
    
                var param = Expression.Parameter(typeof(T), "p");
                var parts = propertyPath.Split('.');
                Expression parent = param;
                foreach (var part in parts)
                {
                    parent = Expression.Property(parent, part);
                }
    
                var sortExpression = Expression.Lambda<Func<T, object>>(parent, param);
    
                return sortExpression;
            }
        }

  4. 使用Autofac,并在Global文件中加入
    //ioc配置(?)
                var builder = new ContainerBuilder();
                builder.RegisterControllers(typeof(MvcApplication).Assembly).PropertiesAutowired();//把当前程序集中的 Controller 都注册
                //获取所有相关类库的程序集
                Assembly[] assemblies = new Assembly[] { Assembly.Load("HPIT.TEST.Service") };
                //当请求这个程序集下的接口里面的方法时候。就会返回对应的Services类里面的实现
                builder.RegisterAssemblyTypes(assemblies)
                .Where(type => !type.IsAbstract
                        && typeof(IServiceSupport).IsAssignableFrom(type))
                        .AsImplementedInterfaces().PropertiesAutowired();  //如果一个实现类中定义了其他类型的接口属性,会自动
                //给属性进行“注入”
                //Assign:赋值
                //type1.IsAssignableFrom(type2)   type2是否实现了type1接口/type2是否继承自type1
                //typeof(IServiceSupport).IsAssignableFrom(type)只注册实现了IServiceSupport的类
                //避免其他无关的类注册到AutoFac中
    
                var container = builder.Build();
                //注册系统级别的DependencyResolver,这样当MVC框架创建Controller等对象的时候都是管Autofac要对象。
                DependencyResolver.SetResolver(new AutofacDependencyResolver(container));//!!!
    

    其中,"HPIT.TEST.Service"内容提供替换为Server类库名称

  5. 创建common类库,在其下创建JsonHelper和PredicateExtensions类
  6. JsonHelper类内容(需要引入Newtonsoft.Json.Converters;)
    public static class JsonHelper
        {
            /// <summary>
            /// 将对象序列化为json格式字符串
            /// </summary>
            /// <param name="obj"></param>
            /// <returns></returns>
            public static string ToJson(this object obj)
            {
    
                var timeConverter = new IsoDateTimeConverter
                    {DateTimeFormat = "yyyy-MM-dd"}; //这里使用自定义日期格式,默认是ISO8601格式        
                //进行序列化 1.系统自带的序列化方法  2.json.net 中  3. redis组件中
                return JsonConvert.SerializeObject(obj, timeConverter);
            }
    
            /// <summary>
            /// 将json格式字符串反序列化为对象
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="str"></param>
            /// <returns></returns>
            public static T ToObject<T>(this string str)
            {
                if (!string.IsNullOrWhiteSpace(str))
                {
                    return JsonConvert.DeserializeObject<T>(str);
                }
                else
                {
                    return default(T);
                }
            }
        }

 ParameterReplacer内容为

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<T, object>> GetSortLambda<T>(string propertyPath)
        {

            var param = Expression.Parameter(typeof(T), "p");
            var parts = propertyPath.Split('.');
            Expression parent = param;
            foreach (var part in parts)
            {
                parent = Expression.Property(parent, part);
            }

            var sortExpression = Expression.Lambda<Func<T, object>>(parent, param);

            return sortExpression;
        }
        public static Expression<Func<T, bool>> True<T>() { return f => true; }

        public static Expression<Func<T, bool>> False<T>() { return f => false; }

        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> exp_left, Expression<Func<T, bool>> exp_right)
        {
            var candidateExpr = Expression.Parameter(typeof(T), "");
            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<T, bool>>(body, candidateExpr);
        }

        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> exp_left, Expression<Func<T, bool>> exp_right)
        {
            var candidateExpr = Expression.Parameter(typeof(T), "");
            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<T, bool>>(body, candidateExpr);
        }
    }

DTO中创建JobD类

public  class JobD
    {

        public string Id { get; set; }

        public string Name { get; set; }

        public string Code { get; set; }

        public DateTime? UpdateTime { get; set; }

        public DateTime? CreateTime { get; set; }
    }

IService中创建IJobS类

public interface IJobS : IServiceSupport
    {
        List<JobD> SPage(int offset, int limit, string name, string code, string sort, string order, ref int rowCount);
        bool Add(JobD model);
        JobD GUpd(string id);
        bool Upd(JobD model);
        bool Del(string str);
    }

Service中创建JobS类

public class JobS:IJobS
    {
        public List<JobD> SPage(int offset, int limit, string name, string code, string sort, string order, ref int rowCount)
        {
            using (var db = new OAT())
            {
                BaseService<Job> bs = new BaseService<Job>(db);
                rowCount = 0;
                Expression<Func<Job, bool>> where = d => d.IsDel == 1;
                if (!String.IsNullOrWhiteSpace(name))
                {
                    where = where.And(r => r.Name.Contains(name));
                }
                if (!String.IsNullOrWhiteSpace(code))
                {
                    where = where.And(r => r.Code == code);
                }
                var orderBy = Common.PredicateExtensions.GetSortLambda<Job>(sort);
                bool orderType = order == "asc" ? true : false;
                var list = bs.GetPagedList(offset, limit, ref rowCount, where, orderBy, orderType).Select(b => new JobD
                {
                    Id = b.Id,
                    Name = b.Name,
                    Code = b.Code
                }).ToList();
                return list;
            }
        }

        public bool Add(JobD model)
        {
            using (var db = new OAT())
            {
                BaseService<Job> bs = new BaseService<Job>(db);
                Job j = new Job();
                j.Id = Guid.NewGuid().ToString();
                j.Name = model.Name;
                j.Code = model.Code;
                j.CreateTime = DateTime.Now;
                j.UpdateTime = null;
                j.IsDel = 1;
                return bs.Add(j);
            }
        }

        public JobD GUpd(string id)
        {
            using (var db = new OAT())
            {
                BaseService<Job> bs = new BaseService<Job>(db);
                var model = bs.Get(a => a.Id == id);
                JobD j = new JobD();
                j.Id = model.Id;
                j.Name = model.Name;
                j.Code = model.Code;
                return j;
            }
        }

        public bool Upd(JobD model)
        {
            using (var db = new OAT())
            {
                BaseService<Job> bs = new BaseService<Job>(db);
                var modela = db.Job.Find(model.Id);
                modela.Name = model.Name;
                modela.Code = model.Code;
                return bs.Update(modela);
            }
        }

        public bool Del(string str)
        {
            using (var db = new OAT())
            {
                BaseService<Job> bs = new BaseService<Job>(db);
                string[] ida = str.Split(',');
                for (int i = 0; i < ida.Length; i++)
                {
                    var model = db.Job.Find(ida[i]);
                    model.IsDel = 0;
                    bs.Delete(model);
                }
                return true;
            }
        }
    }

注:using Common;

页面代码

<div class="panel-body" style="padding-bottom:0px;">
    <div class="panel panel-default">
        <div class="panel-heading">查询条件</div>
        <div class="panel-body">
            <form id="formSearch" class="form-horizontal">
                <div class="form-group">
                    <label class="control-label col-sm-1" for="txt_search_departmentname">部门名称</label>
                    <div class="col-sm-3">
                        <input type="text" class="form-control" id="txtName">
                    </div>
                    <label class="control-label col-sm-1" for="txt_search_statu">状态</label>
                    <div class="col-sm-3">
                        <input type="text" class="form-control" id="txtCode">
                    </div>
                    <div class="col-sm-4" style="text-align:left;">
                        <button type="button" style="margin-left:50px" id="btn_query" onclick="QueryData()" class="btn btn-primary">查询</button>
                    </div>
                </div>
            </form>
        </div>
    </div>

    <div id="toolbar" class="btn-group">
        <button id="btn_add" type="button" class="btn btn-default" data-toggle="modal" data-target="#myModal">
            <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>新增
        </button>
        <button id="btn_edit" type="button" class="btn btn-default" onclick="Upd()">
            <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>修改
        </button>
        <button id="btn_delete" type="button" class="btn btn-default" onclick="Del()">
            <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>删除
        </button>
    </div>
    <table id="tb_departments"></table>
</div>

<!-- 模态框(Modal) -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
                <h4 class="modal-title" id="myModalLabel">添加</h4>
            </div>
            <form class="form-horizontal" role="form" id="AoU">
                <input type="text" hidden id="txtStatus" />
                <div class="form-group">
                    <label for="Name" class="col-sm-2 control-label">名称</label>
                    <div class="col-sm-5">
                        <input type="text" class="form-control" id="Name"
                               placeholder="请输入名称">
                    </div>
                </div>
                <div class="form-group">
                    <label for="Code" class="col-sm-2 control-label">代码</label>
                    <div class="col-sm-5">
                        <input type="text" class="form-control" id="Code"
                               placeholder="请输入代码">
                    </div>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
                    <button type="button" onclick="sub()" class="btn btn-primary" data-dismiss="modal">提交</button>
                </div>
            </form>
        </div>
    </div>
</div>
@section scripts
{
    <script src="~/Content/dist/bootstrap-table.js"></script>
    <link href="~/Content/dist/bootstrap-table.css" rel="stylesheet" />
    <script src="~/Content/dist/locale/bootstrap-table-zh-CN.min.js"></script>
    <script>
        $(function () {
            a();
        });

        function QueryData() {
            $('#tb_departments').bootstrapTable('refresh', {
                query: {
                    name: $("#txtName").val(),
                    code: $("#txtCode").val()
                }
            });
        }
        //模态框居中
        $('#myModal').on('show.bs.modal', function () {
            var $this = $(this);
            var $modal_dialog = $this.find('.modal-dialog');
            $this.css('display', 'block');
            $modal_dialog.css({ 'margin-top': Math.max(0, ($(window).height() - $modal_dialog.height()) / 2) });

        });
        //关闭清空
        $('#myModal').on('hidden.bs.modal',
            function () {
                $("#Name").val("");
                $("#Code").val("");
                $("#txtStatus").val("");
                $("#myModalLabel").text("添加");
            });

        function sub() {
            $.ajax({
                url: $("#txtStatus").val() == "" ? "/Main/Add" : "/Main/Upd",
                data: {
                    name: $("#Name").val(),
                    code: $("#Code").val(),
                    id: $("#txtStatus").val(),
                },
                success: function (data) {
                    if (data == "a") {
                        $('#myModal').modal('hide');
                        //{#刷新表格数据# }
                        $("#tb_departments").bootstrapTable('refresh');

                    } else {
                    }
                }
            });
        }

        function Upd() {
            var array = $("#tb_departments").bootstrapTable('getSelections');
            if (array.length < 1) {
                alert("请选择");
                return;
            } else if (array.length > 1) {
                alert("请选择一条");
                return;
            } else {
                var str = array[0].Id;
                $.ajax({
                    url: "/Main/GUpd",
                    data: {
                        str: str
                    },
                    dataType: "json",
                    success: function (data) {
                        $('#myModal').modal('show');
                        $("#myModalLabel").text("修改");
                        $("#Name").val(data.Name);
                        $("#Code").val(data.Code);
                        $("#txtStatus").val(data.Id);
                    }
                });
            }
        }

        function Del() {
            var array = $("#tb_departments").bootstrapTable('getSelections');
            if (array.length < 1) {
                alert("请选择");
                return;
            }
            var str = "";
            for (var i = 0; i < array.length; i++) {
                str += array[i].Id + ",";
            }
            if (str != "") {
                str = str.substring(0, str.length - 1);
            }
            if (confirm("确认删除?")) {
                $.ajax({
                    url: "/Main/Del",
                    data: {
                        str: str
                    },
                    success: function (data) {
                        if (data == "a") {
                            alert("删除成功");
                            //{#刷新表格数据# }
                            $("#tb_departments").bootstrapTable('refresh');
                        }

                    }
                });
            }
        }

        function a() {
            $('#tb_departments').bootstrapTable({
                url: '/Main/SPage',         //请求后台的URL(*)
                method: 'get',                      //请求方式(*)
                toolbar: '#toolbar',                //工具按钮用哪个容器
                striped: true,                      //是否显示行间隔色
                cache: false,                       //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
                pagination: true,                   //是否显示分页(*)
                sortable: true,                     //是否启用排序
                sortOrder: "asc",                   //排序方式
                /*queryParams: oTableInit.queryParams,//传递参数(*)*/
                sidePagination: "server",           //分页方式:client客户端分页,server服务端分页(*)
                pageNumber: 1,                       //初始化加载第一页,默认第一页
                pageSize: 3,                       //每页的记录行数(*)
                pageList: [3, 6, 9, 12],        //可供选择的每页的行数(*)
                search: true,                       //是否显示表格搜索,此搜索是客户端搜索,不会进服务端,所以,个人感觉意义不大
                strictSearch: true,
                showColumns: true,                  //是否显示所有的列
                showRefresh: true,                  //是否显示刷新按钮
                minimumCountColumns: 2,             //最少允许的列数
                clickToSelect: true,                //是否启用点击选中行
                height: 500,                        //行高,如果没有设置height属性,表格自动根据记录条数觉得表格高度
                uniqueId: "ID",                     //每一行的唯一标识,一般为主键列
                showToggle: true,                    //是否显示详细视图和列表视图的切换按钮
                cardView: false,                    //是否显示详细视图
                detailView: false,                   //是否显示父子表
                columns: [{
                    checkbox: true
                }, {
                    field: 'Name',
                    title: '职位名称',
                    sortable: true
                }, {
                    field: 'Code',
                    title: '职位代码',
                    sortable: true
                }]
            });
        }
    </script>
}

控制器代码为

public class MainController : Controller
    {
        // GET: Main
        private readonly IJobS _jobService;
        public MainController(IJobS jobService)
        {
            _jobService = jobService;
        }
        public ActionResult Index()
        {
            return View();
        }
        public ActionResult SPage(int offset, int limit, string name, string sort, string order, string code)
        {
            int count = 0;
            if (String.IsNullOrWhiteSpace(sort))
            {
                sort = "Id";
            }
            var lst = _jobService.SPage(offset, limit, name, code, sort, order, ref count);
            return Json(new { total = count, rows = lst }, JsonRequestBehavior.AllowGet);
        }
        public ActionResult Add(JobD model)
        {
            bool flag = _jobService.Add(model);
            if (flag)
            {
                return Content("a");
            }
            else
            {
                return Content("b");
            }
        }
        public ActionResult GUpd(string str)
        {
            var job = _jobService.GUpd(str);

            return Json(job, JsonRequestBehavior.AllowGet);
        }
        public ActionResult Upd(JobD model)
        {
            bool flag = _jobService.Upd(model);
            if (flag)
            {
                return Content("a");
            }
            else
            {
                return Content("b");
            }
        }
        public ActionResult Del(string str)
        {
            bool flag = _jobService.Del(str);
            if (flag)
            {
                return Content("a");
            }
            else
            {
                return Content("b");
            }
        }
    }

将Service中的App.config中链接字符串代码剪切至项目Web.config中(此位置

<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="OAT" connectionString="data source=.;initial catalog=OAGas;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>

若发生未找到具有固定名称System.Data.SqlClient的ADO.NET提供程序错误

请引入EntityFramework程序包

联合查询

public List<StaffDTO> GetShowData(int offset, int limit, ref int rowCount, string sort, string order, string name, string sex, string jobName)
        {
            using (var db = new RentRoomDBContext())
            {


                //Expression<Func<Staff, bool>> where = p => p.IsDel == 1;

                var sortNew = Common.PredicateExtensions.GetSortLambda<Staff>(sort);
                bool orderNew = order == "asc" ? true : false;
                var lst = (from a in db.Staff
                           join b in db.Job
                           on a.JobId equals b.Id
                           where a.IsDel == 1
                           select new DTO.StaffDTO
                           {
                               Id = a.Id,
                               Uname = a.Uname,
                               Pwd = a.Pwd,
                               Name = a.Name,
                               Sex = a.Sex,
                               Birthday = a.Birthday,
                               Sheng = a.Sheng,
                               Shi = a.Shi,
                               Qu = a.Qu,
                               Address = a.Address,
                               Email = a.Email,
                               Tel = a.Tel,
                               Status = a.Status,
                               JobId = a.Name,
                               CreateTime = a.CreateTime,
                               UpdateTime = a.UpdateTime,
                               IsDel = a.IsDel,
                               JobName = b.Name
                           }).ToList();
                if (!string.IsNullOrWhiteSpace(name))
                {
                    lst = lst.Where(a => a.Name.Contains(name)).ToList();
                }
                if (!string.IsNullOrWhiteSpace(sex))
                {
                    int s = int.Parse(sex);
                    lst = lst.Where(a => a.Sex == s).ToList();
                }
                if (jobName != "--请选择--")
                {
                    lst = lst.Where(h => h.JobName == jobName).ToList();
                }
                rowCount = lst.Count();
                lst = lst.OrderBy(a => a.Id).Skip(offset).Take(limit).ToList();

                return lst.ToList();
            }
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值