asp.net MVC4 框架揭秘 读书笔记系列2

1.2 MVC 变体



MVC 是一种Pattern 另外一种说法是ParaDigm 范例

模式和范例的区别在于前者可以应用到具体的应用上,而后者则仅仅提供一些指导方针

1.2.1 MVP

Model View Presenter 交互图

MVC 模式中元素之间 “混乱”的交互主要体现在允许View 和 Model 绕开Controller进行单独交流,这在MVP 模式中得到了充分解决

PV 模式 (passive View)

解决View很难测试的最好方法是让他无需测试,让UI处理更少逻辑,被动的交给Presenter来处理

暴漏UI不一定必须暴漏UI控件,

没有必要写成

public interface IemployeeSearchView1
{
    DropDownList Department { get; }
    GridView Employees { get; }
}

而可以通过数据的属性来定义接口,这样就可以将presenter中的UI处理逻辑分离出来

public interface IemployeeSearchView
{
    IEnumerable<string> Departments { set; }
    string SelectedDedpartment { get; }
    IEnumerable<Employee> Employees { set; }
}

具体的实现方法如下:

public partial class _Default : System.Web.UI.Page, IemployeeSearchView
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    public IEnumerable<string> Departments
    {
        set
        {
            this.DropDownListDepartments.DataSource = value;
            this.DropDownListDepartments.DataBind();
        }
    }

    public string SelectedDedpartment
    {
        get { return this.DropDownListDepartments.SelectedValue; }
    }

    public IEnumerable<Employee> Employees
    {
        set
        {
            this.GridViewEmployees.DataSource = value;
            this.GridViewEmployees.DataBind();
        }
    }
}

这样做意味着所有的UI逻辑都可以被测试,但是它要求将所有可供操作的UI元素定义在对应的接口中,无疑会增加Presenter 的复杂度,这就引出SC模式

SC模式(supervsing Controller)

View 和Presenter 之间的交互式整个MVP的核心,能否正确地应用MVP模式来架构应用,主要取决于View 和Presenter 之间的关系 在由model、View Presenter 组成的三角关系中,核心不是View 而是Presenter,Presenter 不仅是View调用的中介,而是最终决定如何响应用户交互行为的决策者。

View 本身仅仅实现单纯的独立的UI处理逻辑,他处理的数据应该是Presneter实时推送过来的,所以View 尽可能不去维护数据状态,定义在IView的接口最好只包含方法,而避免属性的定义,Presenter 所需的关于View的状态应该在接收到View发送的用户请求时一次性推送,而不需要通过View 的属性去获得它

以下为所有代码

Model

public class Employee
    {
        public string Id { get; private set; }
        public string Name { get; private set; }
        public string Gender { get; private set; }
        public DateTime BirthDate { get; private set; }
        public string Department { get; private set; }

        public Employee(string id, string name, string gender, DateTime birthDate, string department)
        {
            this.Id = id;
            this.Name = name;
            this.Gender = gender;
            this.BirthDate = birthDate;
            this.Department = department;
        }
    }

EmployeeRespository

   public class EmployeeRepository
    {
        private static IList<Employee> employees;

        static EmployeeRepository()
        {
            employees = new List<Employee>();
            employees.Add(new Employee("001", "张三", "男", new DateTime(1981, 8, 1), "销售部"));
            employees.Add(new Employee("001", "李四", "女", new DateTime(1982, 8, 4), "人事部"));
            employees.Add(new Employee("001", "王五", "男", new DateTime(1981, 9, 1), "人事部"));

        }

        public IEnumerable<Employee> GetEmployees(string department = "")
        {
            if (string.IsNullOrEmpty(department))
            {
                return employees;
            }
            return employees.Where(e => e.Department == department).ToArray();

        }
    }

IEmployeeSearchView

 public interface IEmployeeSearchView
    {
        void BindEmployees(IEnumerable<Employee> employees);
        void BindDepartments(IEnumerable<string> departments);

    }

    public class DepartMentSelectedEventArgs : EventArgs
    {
        public string Department { get; private set; }
        public DepartMentSelectedEventArgs(string department)
        {
            this.Department = department;
        }
    }

EmployeeSearchPresenter

 public class EmployeeSearchPresenter
    {
        public IEmployeeSearchView View { get; private set; }
        public EmployeeRepository Repository { get; private set; }

        public EmployeeSearchPresenter(IEmployeeSearchView view)
        {
            this.View = view;
            this.Repository = new EmployeeRepository();
            view.DepartmentSelected += view_DepartmentSelected;
        }

        public void Initialize()
        {
            var employees = this.Repository.GetEmployees();
            this.View.BindEmployees(employees);
            string[] departments = new string[] { "销售部", "人事部", "IT部" };
            this.View.BindDepartments(departments);
        }

        void view_DepartmentSelected(object sender, DepartMentSelectedEventArgs e)
        {
            string department = e.Department;
            var employees = Repository.GetEmployees(department);
            this.View.BindEmployees(employees);
        }
    }

Web

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="Chaper1SC.WebForm1" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div id="page">
            <div style="text-align: center; clear: both">
                请选择部门:<asp:DropDownList ID="dpDownListDepartments" runat="server"></asp:DropDownList><asp:Button Text="查询" runat="server" OnClick="Unnamed_Click" />
            </div>
            <div>
                <asp:GridView ID="GvEmployees" runat="server" AutoGenerateColumns="false" Width="100%">
                    <Columns>
                        <asp:BoundField DataField="Name" HeaderText="姓名" />
                        <asp:BoundField DataField="Gender" HeaderText="性别" />
                        <asp:BoundField DataField="BirthDate" HeaderText="出生日期" DataFormatString="{0:dd/MM/yy}" />
                        <asp:BoundField DataField="Gender" HeaderText="性别" />
                    </Columns>
                </asp:GridView>
            </div>
        </div>
    </form>
</body>
</html>
 public partial class WebForm1 : System.Web.UI.Page, IEmployeeSearchView
    {
        public event EventHandler<DepartMentSelectedEventArgs> DepartmentSelected;
        public EmployeeSearchPresenter Presenter { get; private set; }

        public WebForm1()
        {
            this.Presenter = new EmployeeSearchPresenter(this);
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                this.Presenter.Initialize();
            }
        }

        public void BindEmployees(IEnumerable<Employee> employees)
        {
            this.GvEmployees.DataSource = employees;
            this.GvEmployees.DataBind();
        }

        public void BindDepartments(IEnumerable<string> departments)
        {
            this.dpDownListDepartments.DataSource = departments;
            this.dpDownListDepartments.DataBind();
        }

        protected void Unnamed_Click(object sender, EventArgs e)
        {
            string deparment = this.dpDownListDepartments.SelectedValue;
            DepartMentSelectedEventArgs args = new DepartMentSelectedEventArgs(deparment);
            if (null != DepartmentSelected)
            {
                DepartmentSelected(sender, args);
            }
        }

    }
时间: 2024-10-12 08:55:24

asp.net MVC4 框架揭秘 读书笔记系列2的相关文章

asp.net MVC4 框架揭秘 读书笔记系列3

IIS/ASP.net管道 本节全部用图形表示便于理解和记忆 1.3.1 IIS5.x与asp.net 1.3.2 IIS 6.0与asp.net 1.3.3 IIS7.0与asp.net 基于IIS6.0与asp.net 双管道设计 基于IIS7.0与asp.net 集成管道设计 1.3.4 asp.net管道

asp.net MVC4 框架揭秘 读书笔记系列1

1.1 传统MVC 名词解释 Autonomous View. AV. 自制视图 GUI图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面.与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受. SoC seperation of concers 关注点分离(Separation of concerns,SOC)是对只与“特定概念.目标”(关注点)相关联的软件组成部分进行“标识.封装和操纵”

Asp.Net揭秘读书笔记

Asp.Net揭秘读书笔记 2016年5月16日, 星期一 runat="server"属性代表了一个在服务器端执行的asp.net控件: 如果在webconfig中添加了命名空间,整个项目就可以使用这个类库了 asp控件的textbox举例:<asp:Textbox id="textbox1" runat="server" /> asp:前缀: 指定控件的命名空间 id,所有控件必须有一个唯一的id,可以在代码引用 方法中sende

学习ASP.NET MVC框架揭秘笔记目录

学习ASP.NET MVC框架揭秘笔记目录 第一章     ASP.NET+MVC 1.1传统的MVC模式 持续更新中,,,,

C#刨根究底:《你必须知道的.NET》读书笔记系列

一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP-王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心得和感悟,将技术问题以生动易懂的语言展开,层层深入,以例说理.全书主要,包括了.NET基础知识及其深度分析,以.NET Framework和CLR研究为核心展开.NET本质论述,涵盖了.NET基本知识几乎所有的重点内容.全书分为5个部分,第1部分讲述.NET与面向对象,从底层实现角度分析了.NET如何实现面向

C#温故知新:《C#图解教程》读书笔记系列

一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种特性.新版本除了精心修订旧版内容外,还全面涵盖了C# 5.0的新增特性,比如异步编程.调用者信息.case表达式.带参数的泛型构造函数.支持null类型运算等.通过本书,读者能够快速.深入地理解C#,为自己的编程生涯打下良好的基础. 本书是C#入门的经典好书,适合对C#感兴趣的所有读者.Daniel

《Mastering Opencv ...读书笔记系列》车牌识别(I)

http://blog.csdn.net/jinshengtao/article/details/17883075/  <Mastering Opencv ...读书笔记系列>车牌识别(I) http://blog.csdn.net/jinshengtao/article/details/17954427   <Mastering Opencv ...读书笔记系列>车牌识别(II) Mastering Opencv ...读书笔记系列>车牌识别(I) 标签: 车牌分割svm西

Web高级征程:《大型网站技术架构》读书笔记系列

一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计案例,为读者呈现一幅包括技术选型.架构设计.性能优化.Web安全.系统发布.运维监控等在内的大型网站开发全景视图. 本书不仅适用于指导网站工程师.架构师进行网站技术架构设计,也可用于指导产品经理.项目经理.测试运维人员等了解网站技术架构的基础概念:还可供包括企业系统开发人员在内的各类软件开发从业人员借鉴,了解

ASP.NET Core框架揭秘 链接

将金楠老师的ASP.NET Core框架揭秘 http://www.cnblogs.com/artech/p/inside-asp-net-core-1.html 第一部分 编程基础 如果没有Visual Studio 2015,我们如何创建.NET Core项目 ?通过几个Hello World感受.NET Core全新的开发体验难道.NET Core到R2连中文编码都不支持吗? 第二部分 基础框架 依赖注入        控制反转(IoC)        依赖注入(DI)        服务