65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 ASP.NET MVP 的 Entity Framework 实现

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.07/5 (9投票s)

2011 年 4 月 20 日

GPL3

3分钟阅读

viewsIcon

60909

downloadIcon

408

使用 ASP.NET MVP 的 Entity Framework 实现

背景

ASP.NET MVP 模式在 90 年代末期发展起来。它是 MVC 模式的后代,在设计模式上略有变化,即它实现了 MVC 的观察者设计方法。其余组件保持不变,这意味着模型和视图像在 MVC 中一样完成他们的任务。

MVP (模型-视图-呈现器)

ASP.NET MVP 由三个部分组成。它们是

  1. 模型
  2. 视图
  3. 表示器

模型

模型是域类型或业务级别对象。它包含应用程序数据,并提供逻辑和行为来访问数据。模型需要独立,不应存在任何关于用户界面 (UI) 的问题。由于模型应该独立,因此同一个模型可以被不同类型的 UI 级别应用程序使用。

视图

视图是一个占位符,它保存模型数据并将其显示给应用程序用户。简单来说,视图是一个用于呈现模型数据的 Web 窗体。模型与视图没有直接联系,而视图应该了解它们的模型。

表示器

呈现器处理用户输入,并使用它来操作模型数据。视图将用户输入操作传递给呈现器进行解释。呈现器将对从视图接收的数据采取行动,并与模型通信,然后将结果返回给视图。
下图描述了 MVP 模式的基本流程。

图. MVP 架构

MVP 与 Web 窗体 Vs. MVC

Web 窗体具有高生产力,但对标记、URL 和代码的控制较少。MVC(模型-视图-控制器)对标记、URL 和代码具有高控制,但生产力较低。MVP 在生产力和控制之间实现了平衡。

MVC 和 MVP 之间的选择

在 MVC 中,模型存储数据,视图是数据的表示,控制器允许用户更改数据。当数据发生更改时,所有视图都会收到更改通知,并根据需要进行自身更新。MVP 是 MVC 的衍生产品。

MVP 减少了对视图的控制,并将大部分责任放在呈现器中。它试图使所有逻辑成为呈现器的一部分,因此视图是“被动的”。MVC 和 MVP 的基本思想是相同的,模型存储数据,视图是数据的表示,呈现器协调数据。

Entity Framework 简介

在现实世界编程中,数据库开发人员更喜欢使用关系模型来表示数据,而应用程序开发人员更喜欢使用面向对象模型。ADO.NET Entity Framework 解决了这两种模型之间的差异。ADO.NET Entity Framework 是 ADO.NET 的后代,它提供了概念实体(.NET 类)和数据存储之间的对象关系映射。Entity Framework 使用实体数据模型,该模型由存储架构、概念架构、映射架构和实体类组成。

流程图

  1. 首先,在 VWD(Visual Web Developer)中创建一个新的 ASP.NET 空 Web 应用程序。在我的例子中,我使用了 VS 2010。
  2. 之后,在文件 *IView.cs* 中为视图名称 `IView` 添加一个新的接口。代码如下
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using TestMVPApp.Model;
    
    namespace TestMVPApp.View
    {
        public interface IView
        {
            string FirstName { get; set; }
            string MiddleName { get; set; }
            string LastName { get; set; }
            string Address { get; set; }
            string ContactNo { get; set; }
            string Message { get; set; }
         }
    }
  3. 添加一个呈现器类,并将其命名为 *Presenter.cs*,其中包含以下代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using TestMVPApp.Model;
    using TestMVPApp.View;
    using System.Web;
    using System.Configuration;
    
    namespace TestMVPApp.Presenter
    {
    	public class TestPresenter
    	{
    		IView detailsView;
    		public TestPresenter(IView view)
    		{
    			detailsView = view;
    		}
    		public string SaveDetails()
    		{
    			TestModel test = new TestModel();
    			if (test.SaveDetails(detailsView.FirstName, 
    				detailsView.MiddleName, detailsView.LastName, 
    				detailsView.Address, detailsView.ContactNo))
    			{
    				detailsView.Message = "Success";
    
    			}
    			else
    			{
    				detailsView.Message = "Failure";
    			}
    			detailsView.FirstName = string.Empty;
    			detailsView.MiddleName = string.Empty;
    			detailsView.LastName = string.Empty;
    			detailsView.Address = string.Empty;
    			detailsView.ContactNo = string.Empty;
    			return detailsView.Message.ToString();
    		}
    	}
    }
  4. 添加呈现器类后,添加一个视图页面,并将其命名为 *InputViewPage.aspx*。在此 UI 页面中,创建一个表和字段,用于输入名字、中间名、姓氏、地址和联系电话。

    在代码隐藏中,编写代码以实现接口 `IView`。代码如下

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using TestMVPApp.Presenter;
    
    namespace TestMVPApp.View
    {
        public partial class InputViewPage : System.Web.UI.Page, IView
        {
            protected void Page_Load(object sender, EventArgs e)
            {
            }
    
            protected void btnShowData_Click(object sender, EventArgs e)
            {
                TestPresenter detailsPresenter = new TestPresenter(this);
                if (detailsPresenter.SaveDetails() != null)
                {
                    Response.Redirect("DisplayViewPage.aspx");
                }
            }
    
            public string FirstName
            {
                get { return txtFname.Text; }
                set { txtFname.Text = value; }
            }
            public string MiddleName
            {
                get { return txtMName.Text; }
                set { txtMName.Text = value; }
            }
            public string LastName
            {
                get { return txtLName.Text; }
                set { txtLName.Text = value; }
            }
            public string Address
            {
                get { return txtAddress.Text; }
                set { txtAddress.Text = value; }
            }
            public string ContactNo
            {
                get { return txtContact.Text; }
                set { txtContact.Text = value; }
            }
            public string Message
            {
                get { return ltrlMessage.Text; }
                set { ltrlMessage.Text = value; }
            }       
        }
    }
  5. 现在是编写模型类的时候了。在此之前,添加一个新的 Entity 数据模型并命名它,并相应地创建一个数据库连接。在模型类中,编写以下代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace TestMVPApp.Model
    {
    	public interface IModel
    	{
    		List<tbl_userdetails> ReturnDetails();
    	}
    
    	public class TestModel : IModel
    	{
    		private Entities textContext = new Entities();
    		private Tbl_UserDetails testDetails;
    		private IEnumerable<tbl_userdetails> detailsList;
    		public TestModel() { }
    
    		public bool SaveDetails(string firstName, 
    		string middleName, string lastName, string address, 
    						string contactNo)
    		{
    			testDetails = new Tbl_UserDetails()
    			{
    				FirstName = firstName,
    				MiddleName = middleName,
    				LastName = lastName,
    				Address = address,
    				ContactNo = contactNo
    			};
    			textContext.AddToTbl_UserDetails(testDetails);
    			int testValue = textContext.SaveChanges();
    			if (testValue > 0)
    			{
    				return true;
    			}
    			else
    			{
    				return false;
    			}
    		}
    		
    		public List<tbl_userdetails> ReturnDetails()
    		{
    			//detailsList = from v in 
    			//textContext.GetDetails() select v;
    			return detailsList.ToList<tbl_userdetails>();
    		}
    	}
    }
  6. 现在可以运行应用程序了,将出现以下屏幕

    mainpage.JPG

    图. 主页(视图)
  7. 填写详细信息并提交数据。如果数据成功保存在数据库中,则会出现以下屏幕

    success.JPG

    图. 成功屏幕

结论

本文介绍了使用 Entity Framework 的 ASP.NET MVP,并以逐步的方式指导您。祝您编码愉快。

© . All rights reserved.