ASP.NET MVC3.0+ JqGrid+Unit Of Work+ Repository/ EF 4.1 CRUD应用 (多层结构)

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

摘要

本文中,我将展示使用基于asp.net mvc3+EF来操作JQGrid制作表格

假设你了解ASP.NET MVC3.0与EF4.x的配合操作

下载地址

源码下载2.66MB

数据库下载154kb

分层设计

  • DAL: 数据访问层包含repositories和EF4.x的代码, 该层所做事务直接操作数据库,针对数据的增、删、改、查。
  • BLL: 针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。.
  • Web UI层:职责是数据的展现和采集,数据采集的结果通常以Entity object提交给BL层处理。Service Interface侧层用于将业务或数据资源发布为服务(如WebServices)。


项目结构




实现细节

EF4.X第一个数据模型
在项目DAL层中右键---新增加项目--选择 ADO.NET Entity Data Model.
点击添加


在向导中,选择从数据库生成


点击下一步

注意:我使用的数据库名为“ProgrammingEFDB1”这个演示,下载的数据库文件中,它有两个表,contact 和address。

下一步的向导将给你的选项来配置您的数据库连接。

单击新的连接并选择您想要的数据库连接属性弹出。在本例中,它是ProgrammingEFDB1。

选中该复选框在底部的向导即“保存数据链接到app.config“。


点击下一步


选中数据库的表和复选框,点击完成按钮

Model1.edmx必须放在DAL层中

双击Model1。edmx打开文件的设计视图。

在设计视图中,右击并从上下文菜单中选择“添加代码生成项目”。

Model1.tt有2种代码生成模式,第一种为POCO代码简介,第二为DBContext

  • Model1.tt 
    It contains POCO classes for each entity in your model.
  • Model1.Context.tt 
    It derived from DBContext to use for querying and persisting data.
下面我们选择DBContext

容器(Repository)

repository就是一个管理数据持久层的,它负责数据的CRUD(Create, Read, Update, Delete)

RepositoryBase。cs(通用库类)

public abstract class RepositoryBase<T> where T : class
    {
        internal ProgrammingEFDB1Entities _dataContext;
        internal DbSet<T> _dbset;
        public RepositoryBase(ProgrammingEFDB1Entities context)
        {
            this._dataContext = context;
            this._dbset = context.Set<T>();
        }
        public virtual List<T> Get(
            Expression<Func<T, bool>> filter = null,
            Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
            string includeProperties = "")
        {
            IQueryable<T> query = _dbset;

            if (filter != null)
            {
                query = query.Where(filter);
            }

            foreach (var includeProperty in includeProperties.Split
                (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
            {
                query = query.Include(includeProperty);
            }

            if (orderBy != null)
            {
                return orderBy(query).ToList();
            }
            else
            {
                return query.ToList();
            }
        }

        public virtual void Add(T entity)
        {
            _dbset.Add(entity);
        }
        public virtual void Delete(T entity)
        {
            _dbset.Remove(entity);
        }
        public virtual void Delete(Expression<Func<T, bool>> where)
        {
            IEnumerable<T> objects = _dbset.Where<T>(where).AsEnumerable();
            foreach (T obj in objects)
                _dbset.Remove(obj);
        }
        public virtual T GetById(long id)
        {
            return _dbset.Find(id);
        }
        public virtual T GetById(string id)
        {
            return _dbset.Find(id);
        }
        public virtual IEnumerable<T> GetAll()
        {
            return _dbset.ToList();
        }
        public virtual IEnumerable<T> GetMany(Expression<Func<T, bool>> where)
        {
            return _dbset.Where(where).ToList();
        }
        public T Get(Expression<Func<T, bool>> where)
        {
            return _dbset.Where(where).FirstOrDefault<T>();
        }
    }

ContactRepository.cs


public class ContactRepository : RepositoryBase<Contact>
    {
        public ContactRepository(ProgrammingEFDB1Entities context)
            : base(context)
        {

        }

        public List<Contact> GetContactPaged(int page, int rows, out int totalCount)
        {

            totalCount = _dataContext.Contacts.Count();
            return _dataContext.Contacts.OrderBy(c => c.ContactID).Skip
        (page * rows).Take(rows).ToList();
        }
    }

事务

优点:
       简单性
       和数据据事务差不多的快
       独立于数据库,不同数据库的专有代码被隐藏了
缺点:
       事务不能跨越多个数据库连接
       事务执行在数据库连接层上,所以需要在事务过程中维护一个数据库连接

UnitofWork.cs

public class UnitOfWork : IDisposable
    {
        private ProgrammingEFDB1Entities _context;
        public UnitOfWork()
        {
            _context = new ProgrammingEFDB1Entities();
        }
        private ContactRepository _contactRepository;
        public ContactRepository ContactRepository
        {
            get
            {

                if (this._contactRepository == null)
                {
                    this._contactRepository = new ContactRepository(_context);
                }
                return _contactRepository;
            }
        }
        public void Save()
        {
            _context.SaveChanges();
        }

        private bool _disposed = false;

        protected virtual void Dispose(bool disposing)
        {
            if (!this._disposed)
            {
                if (disposing)
                {
                    _context.Dispose();
                }
            }
            this._disposed = true;
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
    }

业务逻辑层


它封装了应用程序的业务逻辑。
在代码演示,我只使用单个类命名为ManageContacts.cs。
它使用工作单元模式的应用程序业务操作。

ManageContacts.cs

public class ManageContacts
    {
        public IEnumerable<Contact> GetContacts()
        {
            IEnumerable<Contact> contacts;
            using (UnitOfWork unitOfWork = new UnitOfWork())
            {
                contacts = unitOfWork.ContactRepository.GetAll();
            }
            return contacts;
        }

        public bool AddContact(Contact contact)
        {
            using (UnitOfWork unitOfWork = new UnitOfWork())
            {
                unitOfWork.ContactRepository.Add(contact);
                unitOfWork.Save();
            }
            return true;
        }

        public bool UpdateContact(Contact contact, int id)
        {
            using (UnitOfWork unitOfWork = new UnitOfWork())
            {
                var contactEntity = unitOfWork.ContactRepository.GetById(id);
                contactEntity.Title = contact.Title;
                contactEntity.FirstName = contact.FirstName;
                contactEntity.LastName = contact.LastName;
                contactEntity.ModifiedDate = DateTime.Now;
                unitOfWork.Save();
            }
            return true;
        }

        public bool DeleteContact(int id)
        {
            using (UnitOfWork unitOfWork = new UnitOfWork())
            {
                Contact contact = unitOfWork.ContactRepository.GetById(id);
                unitOfWork.ContactRepository.Delete(contact);
                unitOfWork.Save();
            }
            return true;
        }

        public List<Contact> GetContactPaged(int page, int rows, out int totalCount)
        {
            List<Contact> contacts;
            using (UnitOfWork unitOfWork = new UnitOfWork())
            {
                contacts = unitOfWork.ContactRepository.GetContactPaged
                (page, rows, out totalCount);
            }
            return contacts;
        }
        public Contact GetById(int id)
        {
            Contact contact;
            using (UnitOfWork unitOfWork = new UnitOfWork())
            {
                contact = unitOfWork.ContactRepository.GetById(id);
            }
            return contact;
        }
    }

Controller

ASP.NET MVC Controller对象的职责是传递数据,获取View对象(实现了IView接口的类),通知View对象显示.

View对象的作用是显示.虽然显示的方法RenderView()是由Controller调用的,

但是Controller仅仅是一个"指挥官"的作用, 具体的显示逻辑仍然在View对象中

  • GridDemoData():返回Json数据给JQgrid绑定
  • PerformCRUDOperation(): 处理用户传递的操作

HomeController.cs

public ActionResult GridDemoData(int page, int rows, 
    string search, string sidx, string sord)
        {
            var manageContacts = new ManageContacts();
            int currentPage = Convert.ToInt32(page) - 1;
            int totalRecords = 0;

            var data = manageContacts.GetContactPaged
        (currentPage, rows, out totalRecords);

            var totalPages = (int)Math.Ceiling(totalRecords / (float)rows);
            var jsonData = new
            {
                total = totalPages,
                page,
                records = totalRecords,

                rows = (
                           from m in data
                           select new
                           {
                               id = m.ContactID,
                               cell = new object[]
                                      {
                                           m.Title,
                                           m.FirstName,
                                           m.LastName
                                      }
                           }).ToArray()
            };
            return Json(jsonData, JsonRequestBehavior.AllowGet);
        }
        public ActionResult PerformCRUDAction(Contact contact)
        {
            var manageContacts = new ManageContacts();

            bool result = false;
            switch (Request.Form["oper"])
            {
                case "add":
                    contact.AddDate = DateTime.Now.Date;
                    contact.ModifiedDate = DateTime.Now;
                    result = manageContacts.AddContact(contact);
                    break;
                case "edit":
                    int id = Int32.Parse(Request.Form["id"]);
                    result = manageContacts.UpdateContact(contact,id);
                    break;
                case "del":
                    id = Int32.Parse(Request.Form["id"]);
                    result = manageContacts.DeleteContact(id);
                    break;
                default:
                    break;
            }
            return Json(result);
        }

View (UI Layer)

JqGrid Setup Requirements

The following code is used for JqGrid setup in site.master.

<link href="<%= ResolveUrl("~/Content/themes/flick/ui.jqgrid.css") %>" rel="stylesheet"
        type="text/css" />

Following HTML code need to be added in  index.aspx  for  JqGrid :
<div id="myDiv" style="width: 100%">
        <table id="grid" cellpadding="0" cellspacing="0">
        </table>
        <div id="pager" name="pager" style="text-align: center;">
        </div>

    </div>

Below is the JavaScript code for  JqGrid  in  JqGridCRUD.js .
var lastsel;
$(function () {

    $("#grid").jqGrid({
        colNames: ['Title', 'First Name', 'Last Name'],
        colModel: [
                        { name: 'Title', index: 'Title', sortable: false, 
                align: 'left', width: '200',
                            editable: true, edittype: 'text'
                        },
                        { name: 'FirstName', index: 'FirstName', sortable: false, 
                align: 'left', width: '200',
                            editable: true, edittype: 'text'
                        },
                        { name: 'LastName', index: 'LastName', sortable: false, 
                align: 'left', width: '200',
                            editable: true, edittype: 'text'
                        }
                      ],
        pager: jQuery('#pager'),
        sortname: 'FirstName',
        rowNum: 10,
        rowList: [10, 20, 25],
        sortorder: "",
        height: 225,
        viewrecords: true,
        rownumbers: true,
        caption: 'Contacts',
        imgpath: '/Content/jqGridCss/smoothness/images',
        width: 750,
        url: "/Home/GridDemoData",
        editurl: "/Home/PerformCRUDAction",
        datatype: 'json',
        mtype: 'GET',
        onCellSelect: function (rowid, iCol, aData) {

            if (rowid && rowid !== lastsel) {

                if (lastsel)
                    jQuery('#grid').jqGrid('restoreRow', lastsel);
                jQuery('#grid').jqGrid('editRow', rowid, true);
                lastsel = rowid;
            }
        }
    })
    jQuery("#grid").jqGrid('navGrid', '#pager', 
    { edit: false, add: true, del: true, search: false, refresh: true },
            { closeOnEscape: true, reloadAfterSubmit: true, 
            closeAfterEdit: true, left: 400, top: 300 },
            { closeOnEscape: true, reloadAfterSubmit: true, 
            closeAfterAdd: true, left: 450, top: 300, width: 520 },
            { closeOnEscape: true, reloadAfterSubmit: true, left: 450, top: 300 });

});

效果显示


Unit of Work & Repository Framework with ASP.NET MVC, Entity Framework & Unity Entity Framework Power Tools Uow & Repo Framework Generating EF Mappings and POCO’s Upgrading the stack to EF 6.2 Basic Customer CRUD Use Case with MVC Scafolding Template w/ Async Refactoring the CustomerController to use UoW & Repo Framework w/ Async Why the ICustomerService Approach? Why Commit Unit of Work Outside the Service vs. versa Quick Examples with Eager Loading, Filter, and Sorting 立即下载

相关推荐

JqGrid控件 MVC

JqGrid 表格控件,支持树形结构,动态加载数据,可配置添加页面、修改页面; MCV版

基于Java+大数据+Vue手机销售数据分析系统(源码+LW+调试文档+讲解等)/手机销售数据/销售数据分析/手机销售趋势/销售数据可视化/手机销售报告/数据分析系统/手机销售数据解读/销售数据软件

前端:Vue、Vue.js、ElementUI后端:大数据数据库:MySQL、SQLServer开发工具:IDEA、Eclipse、Navicat等✌关于毕设项目技术实现问题讲解也可以给我留言咨询!!!Vue 在程序设计中具有诸多优势。它的简洁语法、组件化开发、强大的指令系统和有效的状态管理,使得程序设计者能够快速构建出高性能、交互性强的应用程序。无论是小型项目还是大型企业级应用,Vue 都能为程序设计提供强大的支持。大数据处理技术具有多样化的特点。

擅长Java、Python、小程序、Web网站开发和计算机毕设项目实战✌ 909

实例讲解在ASP.NET MVC模式通过jQgrid表格操作

实例讲解在ASP.NET MVC模式通过jQgrid表格操作 文章来自学IT网:http://www.xueit.com/asp.net/show-9768-3.aspx实例讲解在ASP.NET MVC模式通过jQgrid表格操作 文章来自学IT网:http://www.xueit.com/asp.net/show-9768-3.aspx

探索DapperUnitOfWork:简化ORM操作的利器

探索DapperUnitOfWork:简化ORM操作的利器 在快速迭代和高效数据处理的需求下,Dapper作为.NET领域内轻量级且高效的ORM工具,一直备受开发者青睐。而今天,我们要向您隆重推荐一个基于Dapper构建的优秀开源项目——DapperUnitOfWork,它由Tim Schreiber精心打造,旨在为Dapper用户提供更强大的单元工作(Unit of Work)和仓储(Repos...

gitblog_01129的博客 900

.NetCore学习笔记:一、UnitOfWork工作单元

Maintains a list of objects affected by a business transaction and coordinates the writing out of changes and the resolution of concurrency problems.   Unit of Work--Martin Fowler Unit Of Work模式,由马丁大叔提出,是一种数据访问模式。UOW模式的作用是在业务用例的操作中跟踪对象的所有更改(增加、删除和更新),并将所..

whyrookie的博客 1258

【使用Blazor构建web应用程序 .NET 6篇 上】

Build web applications with Blazor 使用Blazor构建web应用程序 .NET 6.0篇(上)使用Blazor构建web应用程序第一节Introduction (介绍)第二节 Create a user interface with Blazor components(使用Blazor组件创建一个用户界面) 使用Blazor构建web应用程序 .NET 6.0篇(上)) 使用Blazor构建web应用程序 Build wed applications with Blazo

BlazorComponent的博客 4277

单元测试入门——使用NUnit框架

单元测试入门——使用NUnit框架   单元测试是一种针对源码、低层次的,为程序员设计的测试。可以保证所写的代码符合软件需求和遵循开发的目标,并在软件开发早期减少程序Bug的数量,单元测试是方法层面上的测试,也是测试中粒度最小的测试。 为什么需要单元测试?   关于单元测试的重要性,这里的文章写得很详细:程序员为什么不写单元测试?   1.下载和安装Nuint   在.

sbayje的专栏 957

JqGrid分页

JqGrid EF分页

jqgrid for MVC

jqgrid for MVC

Jqgrid+spring mvc使用心得

前言:项目需要用到表格插件,本来觉得jquery datatable样式不错,后台发现没有继承checkbox等问题,最终转而使用jqgrid。 项目语言及架构:java spring mvc 1jqgrid的创建: jar包地址:http://pan.baidu.com/s/1nutFNvz 密码:i7ka 2、html代码 3、js代码 3.

alex_fung的博客 8335

论在Repository中使用EF框架

最近在思考框架的事情,从Petshop的传统三层框架过渡到目前的DDD模式。 目前纠结的几个节点是: 1EF这个ORM框架,有没有必要在 Repository 层封装一下,或者直接在 Service 层中创建edmx文件? 另外如果在Repository中创建EF,数据实体就存在于Repository层中,在 IService层,也需要调用Repository.dll, 因为要使用数据实体...

weixin_34233618的博客 238

jqGridASP.NET MVC 3中的实现

  【说明】:本文阐述jqGridASP.NET MVC 3中的实现。                使用的开发工具如下:VS2010、Oracle11g。   【本文的源代码见附件!!】   言归正传,开始讲如何实现Demo。   第一步:右击“VS2010”,以“管理员身份运行”。如图1所示: 图1     【说明】:因为我的程序会部署在IIS上,所以需要以管理员身...

郑林的专栏 282

jqGridMVC中使用方法

Views $(document).ready( function () { $("#table_list_2").jqGrid( { ur

崔钰玺的博客 1545

Unit Of Work--工作单元()

回顾   上一篇我们根据工作单元的原理基于ADO.NET进行了简单的实现,但是当项目需求发生变化的时候,比如需要引入ORM框架又要兼容当前ADO.NET实现的方式时,先前的实现就无法满足这个需求了。   话就不多说了,我们就跟据当前的需求变化来重构工作单元吧。 重构UnitOfWork   首先我们看看原先实现的工作单元提取出来的接口,代码如下: public interface I

极客神殿 2282

关于JqGrid + MVC 提交表格数据,提交多行数据

jqGrid表格数据提交到MVC后台一次保存 Jqgrid代码: var data[]; var rowData = $("#jqgridlist").jqGrid("getRowData"); if (rowData.length < 1) { alert("没有数据!"); return; } for (var i = 0; i < rowData.leng

liudong8510的专栏 8003

jqGrid 学习笔记整理——基础篇

jqGrid 学习笔记整理——基础篇 本人在官网的示例中学习的非常困难,现通过慢慢摸索学习已实现基本功能,特总结下来留给初学者们。 jqGrid 是一个用来显示网格数据的jQuery插件,通过使用jqGrid可以轻松实现前端页面与后台数据的ajax异步通信。

XeonMic的博客 8072

JQGrid与Spring MVC和Gson集成

我在一个单页面应用程序上工作,我想在使用Spring MVC应用程序的一部分中使用网格功能。 自从我上次使用JQGrid以来已经有一段时间了,找到让我起床所需的信息有点困难。 在这篇文章中,我想整理所有信息并将其放入教程中以供遵循,以便任何可能使用相同功能的人都可以发现设置JQGrid很有帮助 。 首先,我们将在Eclipse上设置一个示例Web项目,并如下定义web.xml; &l...

最佳 Java 编程 222

Jqgrid+Spring实现的增删改查(一)

最近基于之前jqgrid+struts的基础上,做了一个jqgrid+spring的例子,大家请上眼。 零: 工程项目图: 一 View <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> jqgrid demo

bruce_sky的专栏 1万+
上一篇: CrystalReportViewer 打印功能ActiveX pdf
下一篇: SQL Server 压缩日志文件.Log
ymnets
博客等级 码龄15年 153粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值