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控件,

没有必要写成

  1. public interface IemployeeSearchView1
  2. {
  3. DropDownList Department { get; }
  4. GridView Employees { get; }
  5. }

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

  1. public interface IemployeeSearchView
  2. {
  3. IEnumerable<string> Departments { set; }
  4. string SelectedDedpartment { get; }
  5. IEnumerable<Employee> Employees { set; }
  6. }

具体的实现方法如下:

  1. public partial class _Default : System.Web.UI.Page, IemployeeSearchView
  2. {
  3. protected void Page_Load(object sender, EventArgs e)
  4. {
  5.  
  6. }
  7.  
  8. public IEnumerable<string> Departments
  9. {
  10. set
  11. {
  12. this.DropDownListDepartments.DataSource = value;
  13. this.DropDownListDepartments.DataBind();
  14. }
  15. }
  16.  
  17. public string SelectedDedpartment
  18. {
  19. get { return this.DropDownListDepartments.SelectedValue; }
  20. }
  21.  
  22. public IEnumerable<Employee> Employees
  23. {
  24. set
  25. {
  26. this.GridViewEmployees.DataSource = value;
  27. this.GridViewEmployees.DataBind();
  28. }
  29. }
  30. }

这样做意味着所有的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

  1. public class Employee
  2. {
  3. public string Id { get; private set; }
  4. public string Name { get; private set; }
  5. public string Gender { get; private set; }
  6. public DateTime BirthDate { get; private set; }
  7. public string Department { get; private set; }
  8.  
  9. public Employee(string id, string name, string gender, DateTime birthDate, string department)
  10. {
  11. this.Id = id;
  12. this.Name = name;
  13. this.Gender = gender;
  14. this.BirthDate = birthDate;
  15. this.Department = department;
  16. }
  17. }

EmployeeRespository

  1. public class EmployeeRepository
  2. {
  3. private static IList<Employee> employees;
  4.  
  5. static EmployeeRepository()
  6. {
  7. employees = new List<Employee>();
  8. employees.Add(new Employee("", "张三", "男", new DateTime(, , ), "销售部"));
  9. employees.Add(new Employee("", "李四", "女", new DateTime(, , ), "人事部"));
  10. employees.Add(new Employee("", "王五", "男", new DateTime(, , ), "人事部"));
  11.  
  12. }
  13.  
  14. public IEnumerable<Employee> GetEmployees(string department = "")
  15. {
  16. if (string.IsNullOrEmpty(department))
  17. {
  18. return employees;
  19. }
  20. return employees.Where(e => e.Department == department).ToArray();
  21.  
  22. }
  23. }

IEmployeeSearchView

  1. public interface IEmployeeSearchView
  2. {
  3. void BindEmployees(IEnumerable<Employee> employees);
  4. void BindDepartments(IEnumerable<string> departments);
  5.  
  6. }
  7.  
  8. public class DepartMentSelectedEventArgs : EventArgs
  9. {
  10. public string Department { get; private set; }
  11. public DepartMentSelectedEventArgs(string department)
  12. {
  13. this.Department = department;
  14. }
  15. }

EmployeeSearchPresenter

  1. public class EmployeeSearchPresenter
  2. {
  3. public IEmployeeSearchView View { get; private set; }
  4. public EmployeeRepository Repository { get; private set; }
  5.  
  6. public EmployeeSearchPresenter(IEmployeeSearchView view)
  7. {
  8. this.View = view;
  9. this.Repository = new EmployeeRepository();
  10. view.DepartmentSelected += view_DepartmentSelected;
  11. }
  12.  
  13. public void Initialize()
  14. {
  15. var employees = this.Repository.GetEmployees();
  16. this.View.BindEmployees(employees);
  17. string[] departments = new string[] { "销售部", "人事部", "IT部" };
  18. this.View.BindDepartments(departments);
  19. }
  20.  
  21. void view_DepartmentSelected(object sender, DepartMentSelectedEventArgs e)
  22. {
  23. string department = e.Department;
  24. var employees = Repository.GetEmployees(department);
  25. this.View.BindEmployees(employees);
  26. }
  27. }

Web

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="Chaper1SC.WebForm1" %>
  2.  
  3. <!DOCTYPE html>
  4.  
  5. <html xmlns="http://www.w3.org/1999/xhtml">
  6. <head runat="server">
  7. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  8. <title></title>
  9. </head>
  10. <body>
  11. <form id="form1" runat="server">
  12. <div id="page">
  13. <div style="text-align: center; clear: both">
  14. 请选择部门:<asp:DropDownList ID="dpDownListDepartments" runat="server"></asp:DropDownList><asp:Button Text="查询" runat="server" OnClick="Unnamed_Click" />
  15. </div>
  16. <div>
  17. <asp:GridView ID="GvEmployees" runat="server" AutoGenerateColumns="false" Width="100%">
  18. <Columns>
  19. <asp:BoundField DataField="Name" HeaderText="姓名" />
  20. <asp:BoundField DataField="Gender" HeaderText="性别" />
  21. <asp:BoundField DataField="BirthDate" HeaderText="出生日期" DataFormatString="{0:dd/MM/yy}" />
  22. <asp:BoundField DataField="Gender" HeaderText="性别" />
  23. </Columns>
  24. </asp:GridView>
  25. </div>
  26. </div>
  27. </form>
  28. </body>
  29. </html>
  1. public partial class WebForm1 : System.Web.UI.Page, IEmployeeSearchView
  2. {
  3. public event EventHandler<DepartMentSelectedEventArgs> DepartmentSelected;
  4. public EmployeeSearchPresenter Presenter { get; private set; }
  5.  
  6. public WebForm1()
  7. {
  8. this.Presenter = new EmployeeSearchPresenter(this);
  9. }
  10.  
  11. protected void Page_Load(object sender, EventArgs e)
  12. {
  13. if (!IsPostBack)
  14. {
  15. this.Presenter.Initialize();
  16. }
  17. }
  18.  
  19. public void BindEmployees(IEnumerable<Employee> employees)
  20. {
  21. this.GvEmployees.DataSource = employees;
  22. this.GvEmployees.DataBind();
  23. }
  24.  
  25. public void BindDepartments(IEnumerable<string> departments)
  26. {
  27. this.dpDownListDepartments.DataSource = departments;
  28. this.dpDownListDepartments.DataBind();
  29. }
  30.  
  31. protected void Unnamed_Click(object sender, EventArgs e)
  32. {
  33. string deparment = this.dpDownListDepartments.SelectedValue;
  34. DepartMentSelectedEventArgs args = new DepartMentSelectedEventArgs(deparment);
  35. if (null != DepartmentSelected)
  36. {
  37. DepartmentSelected(sender, args);
  38. }
  39. }
  40.  
  41. }

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

  1. 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 基于IIS ...

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

    1.1 传统MVC 名词解释 Autonomous View. AV. 自制视图 GUI图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式 ...

  3. ASP.NET MVC5框架揭秘 学习笔记01

    1.自治视图 在早期(作者也没说明是多早,自己猜吧),我们倾向于将所有与UI相关的操作糅合在一起(现在我身边还有很多人这样做),这些操作包括UI界面的呈现. 用户交互操作的捕捉与响应(UI处理逻辑). ...

  4. Android 框架揭秘 --读书笔记

    Android 框架揭秘 Insied the Android Framework

  5. ASP.NET WEB API 2 框架揭秘 读书笔记(一)

    第一章 概述 主要内容是介绍Web的基本概念,Restfull的基本概念及特性.最后介绍创建简单WebApi程序的步骤. Web的基本概念 IP/TCP协议簇分层,分为两种 链路层->网络层-& ...

  6. ASP.NET MVC4框架揭秘 源代码下载

    http://files.cnblogs.com/artech/asp.net.mvc.4.samples.rar

  7. 《ASP.NET Core In Action》读书笔记系列,这是一个手把手的从零开始的教学系列目录

    最近打算系统学习一下asp.net  core ,苦于没有好的中文书藉,只好找来一本英文的 <ASP.NET Core In Action>学习.我和多数人一样,学习英文会明显慢于中文.希 ...

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

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

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

    一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...

随机推荐

  1. mongodb 数据库备份脚本

    写了小shell bash, 用于给mongodb数据进行备份 #!/bin/bash #backup MongoDB #文件目录 #backup MongoDB #!/bin/bash #backu ...

  2. Calendar详解

    (在文章的最后,将会介绍Date类,如果有兴趣,可以直接翻到最后去阅读) 究竟什么是一个 Calendar 呢?中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历.阴(农)历之分.它们的区别 ...

  3. Object类上的方法

    1.getClass: public final native Class<?> getClass(); 返回当前对象运行时的类的对象. 2.hashCode: public native ...

  4. 玩转Git之初识Git

    git是什么 Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目 Git 和 svn 有什么区别 它们之间的主要区别是Git是分布式的,而svn是集中式. 当然Git也可 ...

  5. ping过程详细解读

    0. 前言 在讲解ping过程之前,我们需要了解以下概念. 1). 何为ping   PING (Packet Internet Groper),因特网包探索器,用于测试网络连通性的程序.   Pin ...

  6. 12312312312312ssss

  7. 记录一次读取memcache缓存的优化

    我们是用mvc做web,大部分数据都用memcache做了缓存 有2台memcache缓存服务器 数据并不大. 某页面响应较慢,大概在4s左右. 页面本身很简单只是显示一个表单. 但是layout相对 ...

  8. shallot夏洛特

    ================================================================= ================================== ...

  9. ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础

    ASP.NET MVC在原来ASP.NET的基础上抛弃了基于页面的架构风格,使用了全新的MVC(模型-视图-控制器)架构的一种技术. 目前,它和ASP.NET都共存在.NET Framework之上. ...

  10. 谷歌眼镜能给Apple Watch带来啥前车之鉴?

    当下,你想不听到Apple Watch的消息都难.这款智能手表在三月初发布时,有关它的新闻报道铺天盖地.记者们在博客上对发布会的每个阶段进行了实况报道,苹果粉丝们通过博客. 推特和YouTube视频对 ...