1.仓储模式在MVC应用程序中的使用

目录

这篇文章中,我会解释仓储模式在MVC程序中的使用。

首先,我们需要理解什么是仓储模式【repository Pattern】,来看看下面的图片

没有使用仓储模式的MVC应用程序:

    

使用了仓储模式的MVC应用程序:

仓储模式,是一个抽象层,它将数据库的访问逻辑,映射到实体的访问逻辑。

下面,我们来看做一个应用程序,来体验一下仓储模式吧。

首先,打开VS2013,找到--“文件”--->>"新建"---->>"项目"

选择“ASp.NET Web 应用程序”,输入名称,选择项目存放的位置,点击”确定“按钮

在弹出来的对话框中,选择“MVC”模板,然后点击“更改身份验证”,选择“无身份验证”,点击“确定”。

接下来就生成了项目模板:

好了,第一阶段的工作就完成了。新建一个MVC程序。

现在开始第二阶段的任务:

这篇文章中,我打算使用EF Model First来完成。

首先,我来新建一个数据库,还有数据表,打开SQL 2008

这样就创建好了数据库和数据表,

USE master
GO
IF EXISTS (SELECT * FROM sysdatabases WHERE name=‘EmployeeManagementDB‘)
DROP DATABASE EmployeeManagementDB
GO
CREATE DATABASE EmployeeManagementDB
GO
USE EmployeeManagementDB
GO
IF EXISTS(SELECT * FROM sysobjects WHERE name=‘Employee‘)
DROP TABLE Employee
GO
CREATE TABLE Employee
(
ID INT NOT NULL PRIMARY KEY IDENTITY(1,1),
Name NVARCHAR(50) NOT NULL,
Age INT NOT NULL,
Email NVARCHAR(200) NOT NULL
)

SQL脚本

现在就开始下面的步骤吧,右键点击项目,选择添加-->新建项

在演出来的对话框中,选择Visual C#-->ADO.NET实体数据模型-->输入名称--->添加

然后在弹出开的对话框中,选择第一个-->>>”来自数据库的EF设计器“,点击下一步:

在弹出来的对话框中,选择--“新建连接”,然后点击下一步

在出来的对画框中,输入信息,连接上我们刚才创建的数据库。测试通过之后,点击确定。

好了,截图截的差不多了,现在在我们项目中添加一个文件夹DAL,然后在往这个文件夹中,添加一个接口-->>>IEmployeeRepository.cs.

现在就是Coding了,接口中的代码是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RepositoryPatternMVCWithEntityFramework.DAL
{
    interface IEmployeeRepository<T> where T:class
    {
        /// <summary>
        /// 获取所有的Employee
        /// </summary>
        /// <returns></returns>
        IEnumerable<T> GetAllEmployee();

        /// <summary>
        /// 根据ID获取
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        T GetEmployeeById(object id);

        /// <summary>
        /// 增加
        /// </summary>
        /// <param name="obj"></param>
        void InsertEmployee(T obj);

        /// <summary>
        /// 更新
        /// </summary>
        /// <param name="obj"></param>
        void UpdateEmployee(T obj);

        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="id"></param>
        void DeleteEmployee(object id);

        /// <summary>
        /// 保存
        /// </summary>
        void Save();

        void Dispose();

    }
}

然后在DAL文件夹下,在添加一个类EmployeeRepository ,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace RepositoryPatternMVCWithEntityFramework.DAL
{
    public class EmployeeRepository:IEmployeeRepository<Employee>,IDisposable
    {
        private EmployeeManagementDBEntities context;

        public EmployeeRepository(EmployeeManagementDBEntities context)
        {
            this.context = context;
        }
        public IEnumerable<Employee> GetAllEmployee()
        {
            return context.Employees.ToList();
        }

        public Employee GetEmployeeById(object id)
        {
            return context.Employees.Find(id);
        }

        public void InsertEmployee(Employee obj)
        {
             context.Employees.Add(obj);
        }

        public void UpdateEmployee(Employee obj)
        {
            context.Entry(obj).State = System.Data.EntityState.Modified;
        }

        public void DeleteEmployee(object id)
        {
           Employee em=  context.Employees.Find(id);
           context.Employees.Remove(em);
        }

        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);
        }
    }
}

然后,在控制器文件夹下,添加一个控制器EmployController,空的。。

然后,先暂停一下,我这边打算使用分页,引用pageList.mvc

现在控制器的代码:

using RepositoryPatternMVCWithEntityFramework.DAL;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
//分页引用
using PagedList;
namespace RepositoryPatternMVCWithEntityFramework.Controllers
{
    public class EmployeeController : Controller
    {
        private IEmployeeRepository<Employee> employeeRepository;
        public EmployeeController()
        {
            this.employeeRepository = new EmployeeRepository(new EmployeeManagementDBEntities());

        }

        // GET: Employee
        public ViewResult Index(string sortOrder, string currentFilter, string searchString, int? page)
        {
            ViewBag.CurrentSort = sortOrder;
            ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "ID" : "";
            if (searchString != null)
            {
                page = 1;
            }
            else
            {
                searchString = currentFilter;
            }
            ViewBag.CurrentFilter = searchString;

            var employees = from s in employeeRepository.GetAllEmployee()
                            select s;
            if (!String.IsNullOrEmpty(searchString))
            {
                employees = employees.Where(s => s.Name.ToUpper().Contains(searchString.ToUpper())
                || s.Name.ToUpper().Contains(searchString.ToUpper()));
            }
            switch (sortOrder)
            {
                case "ID":
                    employees = employees.OrderByDescending(s => s.ID);
                    break;
                case "Name":
                    employees = employees.OrderBy(s => s.Name);
                    break;
                case "Email":
                    employees = employees.OrderBy(s => s.Email);
                    break;
                case "Age":
                    employees = employees.OrderBy(s => s.Age);
                    break;
                default:
                    employees = employees.OrderBy(s => s.ID);
                    break;
            }

            int pageSize = 5;
            int pageNumber = (page ?? 1);
            return View(employees.ToPagedList(pageNumber, pageSize));
        }

        // GET: /Employee/Details/5    

        public ViewResult Details(int id)
        {
            Employee emp = employeeRepository.GetEmployeeById(id);
            return View(emp);
        }

        // GET: /Employee/Create    

        public ActionResult Create()
        {
            return View();
        }

        // POST: /Employee/Create    

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(
        [Bind(Include = "Name, Email")] Employee emp)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    employeeRepository.InsertEmployee(emp);
                    employeeRepository.Save();
                    return RedirectToAction("Index");
                }
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(string.Empty, "Some Error Occured.");
            }
            return View(emp);
        }

        // GET: /Employee/Edit/5    

        public ActionResult Edit(int id)
        {
            Employee emp = employeeRepository.GetEmployeeById(id);
            return View(emp);
        }

        // POST: /Employee/Edit/5    

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(Employee emp)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    employeeRepository.UpdateEmployee(emp);
                    employeeRepository.Save();
                    return RedirectToAction("Index");
                }
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(string.Empty, "Some error Occured.");
            }
            return View(emp);
        }

        // GET: /employee/Delete/5    

        public ActionResult Delete(bool? saveChangesError = false, int id = 0)
        {
            if (saveChangesError.GetValueOrDefault())
            {
                ViewBag.ErrorMessage = "Some Error Occured.";
            }
            Employee emp = employeeRepository.GetEmployeeById(id);
            return View(emp);
        }

        // POST: /Employee/Delete/5    

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Delete(int id)
        {
            try
            {
                Employee emp = employeeRepository.GetEmployeeById(id);
                employeeRepository.DeleteEmployee(id);
                employeeRepository.Save();
            }
            catch (Exception ex)
            {
                return RedirectToAction("Delete", new { id = id, saveChangesError = true });
            }
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            employeeRepository.Dispose();
            base.Dispose(disposing);
        }
    }
}

Index视图:

@using PagedList.Mvc;

@model PagedList.IPagedList<Employee>
 @*分页CSS*@
<link href="~/Content/PagedList.css" rel="stylesheet" type="text/css" />   备注一下,这个是添加pagedList分页之后,自动添加进来的。

@{
    ViewBag.Title = "Employee Management System";
}

<h2>Employee Management System</h2>

@using (Html.BeginForm("Index", "Employee", FormMethod.Get))
{
    <p style="background-color:red; color:white; font-size:16pt; padding:10px;">
        Search Employee By Name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
        <input type="submit" value="Search" />
        @Html.ActionLink("Add New Employee", "Create")
    </p>
}
<table style="background-color:white;">
    <tr>
        <th></th>
        <th style="width: 100px;">
            @Html.ActionLink("Emp ID", "Index", new { sortOrder = ViewBag.NameSortParm, currentFilter = ViewBag.CurrentFilter })
        </th>
        <th>
            @Html.ActionLink("Name", "Index", new { sortOrder = ViewBag.NameSortParm, currentFilter = ViewBag.CurrentFilter })
        </th>
        <th>
            Email
        </th>
        <th>
            Age
        </th>
        <th style="width: 150px;"></th>
    </tr>

    @foreach (var item in Model)
    {
        <tr>
            <td></td>
            <td>
                @Html.DisplayFor(modelItem => item.ID)
            </td>
            <td style="width:130px;">
                @Html.DisplayFor(modelItem => item.Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Email)
            </td>
            <td style="width:140px;">
                @Html.DisplayFor(modelItem => item.Age)
            </td>

            <td style="width:270px;">
                @Html.ActionLink("Edit", "Edit", new { id = item.ID }) |
                @Html.ActionLink("Details", "Details", new { id = item.ID }) |
                @Html.ActionLink("Delete", "Delete", new { id = item.ID })
            </td>
        </tr>
    }

</table>
<br />
<div style="background-color:orange; padding-left:15px; padding-top:10px;">
    Showing Records @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount    //备注一下:这里的Pagecount ,PageNumber也都是///分页控件中的
    @Html.PagedListPager(Model, page => Url.Action("Index", new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter }))
</div>    

Create视图:

@model Employee

<script src="~/Scripts/jquery-1.7.1.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Employee</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Email)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Email)
            @Html.ValidationMessageFor(model => model.Email)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Age)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Age)
            @Html.ValidationMessageFor(model => model.Age)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>  

Edit视图:

@model Employee

<script src="~/Scripts/jquery-1.7.1.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
<h2>Edit Employee information</h2>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    @Html.ValidationSummary(true)

    <table>
        <tr>
            <td>@Html.LabelFor(model => model.ID)</td>
            <td>
                @Html.EditorFor(model => model.ID, new { disabled = "disabled", @readonly = "readonly" })

                @Html.ValidationMessageFor(model => model.ID)
            </td>
        </tr>

        <tr>
            <td>
                @Html.LabelFor(model => model.Name)
        </td>
        <td>
            @Html.EditorFor(model => model.Name)
        @Html.ValidationMessageFor(model => model.Name)
    </td>
</tr>

<tr>
    <td>@Html.LabelFor(model => model.Email)</td>
    <td>
        @Html.EditorFor(model => model.Email)
        @Html.ValidationMessageFor(model => model.Email)
    </td>
</tr>
<tr>
    <td>@Html.LabelFor(model => model.Age)</td>
    <td>
        @Html.EditorFor(model => model.Age)
        @Html.ValidationMessageFor(model => model.Age)
    </td>
</tr>

<tr style="background-color: orange; padding: 25px;">
    <td></td>
    <td>
        <input type="submit" value="Save" />
        @Html.ActionLink("Back to List", "Index")
    </td>
</tr>
</table>
}    

delete视图:

@model Employee

<h3>Are you sure you want to delete this?</h3>
<table>
    <tr>
        <td>@Html.DisplayNameFor(model => model.ID)</td>
        <td>@Html.DisplayFor(model => model.ID)</td>
    </tr>
    <tr>
        <td>@Html.DisplayNameFor(model => model.Name)</td>
        <td>@Html.DisplayFor(model => model.Name)</td>
    </tr>
    <tr>
        <td>@Html.DisplayNameFor(model => model.Email)</td>
        <td>@Html.DisplayFor(model => model.Email)</td>
    </tr>
    <tr>
        <td>@Html.DisplayNameFor(model => model.Age)</td>
        <td>@Html.DisplayFor(model => model.Age)</td>
    </tr>
</table>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <table>
        <tr style="background-color: orange; padding: 25px;">
            <td></td>
            <td>
                <input type="submit" value="Delete" />

                @Html.ActionLink("Back to List", "Index")
            </td>

        </tr>
    </table>
}   

Details视图:

@model Employee

<h2>Employee Details</h2>

<table>
    <tr>
        <td>@Html.DisplayNameFor(model => model.ID)</td>
        <td>@Html.DisplayFor(model => model.ID)</td>
    </tr>
    <tr>
        <td>@Html.DisplayNameFor(model => model.Name)</td>
        <td>@Html.DisplayFor(model => model.Name)</td>
    </tr>
    <tr>
        <td>@Html.DisplayNameFor(model => model.Email)</td>
        <td>@Html.DisplayFor(model => model.Email)</td>
    </tr>

   <tr style="background-color: orange; padding: 25px;">
        <td></td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id = Model.ID }) |
        @Html.ActionLink("Back to List", "Index")
    </td>

</tr>
</table>  

效果图:

目录

时间: 2024-08-01 13:24:51

1.仓储模式在MVC应用程序中的使用的相关文章

仓储模式在MVC中的应用学习系列

好久没写博客了,学习的东西,还是需要记录下来,自己懂还得懂得表达出来,这才是最重要的.好了废话说多了,现在开始正题.     在这个系列中,我会把仓储模式和工作单元在MVC应用程序中的应用写出来.有不对的地方,欢迎大家指正. 目录 1.仓储模式在MVC应用程序中的使用 2.泛型仓储模式在MVC应用程序中的使用 3.MVC Code-First和仓储模式的应用 4.待续....

在ASP.NET MVC应用程序中实现Server.Transfer()类似的功能

在ASP.NET MVC应用程序中,如果使用Server.Transfer()方法希望将请求转发到其它路径或者Http处理程序进行处理,都会引发“为xxx执行子请求时出错”的HttpException异常.而在最终实现Server.Transfer()操作的方法内部,我看到这样几行代码. else if (!(handler is Page)) { error = new HttpException(0x194, string.Empty); } 很明显,在方法内部,所有的IHttpHandle

在MVC应用程序中使用jQuery的验证

呵呵,觉得很久没有写博客了,均是工作忙于公司的ERP系统,这是正确的,因为这才是真正的工作. 今天想写点在MVC应用程序中,使用jQuery来验证.在进行之前,还是先回看一下<MVC会员注册>http://www.cnblogs.com/insus/p/3439599.html 这里有些问题需要改正的,如密码文本框,需要把type="text"改为type="password",这样在输入密码时,就不再是明显的了. 另外,所有文本框均没有做验证,是否为必

在ASP.NET MVC应用程序中随机获取一个字符串

在开发ASP.NET MVC应用程序时,有可能需要一个随机字符串,作为密码或是验证码等. 如果你需要的是SQL版本,可以参考<密码需要带特殊字符(二)>http://www.cnblogs.com/insus/archive/2012/02/16/2354453.html 此篇实现方法多少是参照这个实现C#版本. 在应用程序下,创建一个CharacterUtility.cs: 这个类别中,分别有几个静态方法:一,为随机的小写字母: 二,是随机产生大写字母: 三,是随机产生数字: 四,是产生特殊

在MVC应用程序中,怎样删除上传的文件

在ASP.NET MVC应用程序中,怎样删除上传的文件. 由于上传时,真正文件是存储在应用程序某一目录,在数据库表中,只是存储其基本信息.在删除时,需要注意一下,由于没有事务可操作.Insus.NET的实现方法,是先删除物理路径的文件,然后是删除数据库记录. 打开数据库,写一个删除记录的存储过程: 在FileLibraryEntity.cs添加一个Delete的方法: 创建控制器: 先从数据库中获取记录信息,然后组合文件路径,判断是否存在,存在者删除之.最后是删除数据库记录. 创建视图: #1标

MVC应用程序中管理(更新)上传的文件

实现上传文件功能,有时上传也会操作出错,能让用户有改正有机会,开发上传文件能有更新的功能. 文件上传时,如果是存储于应用程序某一目录的话,在更新时需要了解一些流程,先是删除旧文件,更新数据表相关信息,存储新文件. 本篇让你了解到MVC与jQuery的交互处理. 在数据库中,新建一个更新的存储过程: 找到并打开FileLibraryEntity.cs,添加一个vlid更新方法: 在ExerciseController.cs控制器中,创建一个更新Action: A标记,删除旧文件. B标记,获取新上

在MVC应用程序中动态加载PartialView

有时候,我们不太想把PartialView直接Render在Html上,而是使用jQuery来动态加载,或是某一个事件来加载. 为了演示与做好这个练习,我们先在Views目录下的Home下创建_Partial1.cshtml部分视图,视图内容任你自定义,Insus.NET在本例中只让其显示一些文字与一张图片: 接下来,我们需要建立一个ActionResult()方法,在Controllers目录之下,打开HomeController.cs: 再去Views\Home目录,创建一个DynamicL

MVC应用程序中,怎样控制与复制相同的功能

先看此篇<MVC程序实现Autocomplete功能> http://www.cnblogs.com/insus/p/3546255.html 它是实现使用jQuery实现文本框输入文字,出现下拉列表,自动完成与选择功能. 相信你的开发的MVC应用程序中,不止有唯一一个此AutoComplete功能.如果有多个时,或是不断新加时,你的Handlers目录下,肯定会出现多个ashx文件来支持.每增加一个,就会去复制然后修改它.因为这个ashx内处理的是不同类各自的数据. 因此让Insus.NET

连接弹性和命令拦截的 ASP.NET MVC 应用程序中的实体框架

最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    上篇博客我们学习了EF 之 MVC 排序,查询,分页 Sorting, Filtering, and Paging For MVC About EF,本节继续学习 标题中的:连接弹性(微软解释:瞬态错误自动重试连接)和命令拦截(捕捉所有 SQL 查询发送到数据库,以便登录或改变它们) 上网查了大量的资料,网友们基本都是直接翻译原文:Connecti