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("", "张三", "男", new DateTime(, , ), "销售部"));
employees.Add(new Employee("", "李四", "女", new DateTime(, , ), "人事部"));
employees.Add(new Employee("", "王五", "男", new DateTime(, , ), "人事部")); } 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);
}
} }

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. spring AOP 之四:@AspectJ切入点标识符语法详解

    @AspectJ相关文章 <spring AOP 之二:@AspectJ注解的3种配置> <spring AOP 之三:使用@AspectJ定义切入点> <spring ...

  2. BATJ面试必会之并发篇

    一.线程状态转换 新建(New) 可运行(Runnable) 阻塞(Blocking) 无限期等待(Waiting) 限期等待(Timed Waiting) 死亡(Terminated) 二.使用线程 ...

  3. 请整体描述Java异常体系

    java把异常当做对象来处理,并定义一个基类Throwable作为所有异常的超类.在java API中已经定义了许多异常的类,这些异常分为两大类,错误Error和异常Exception.其中异常Exc ...

  4. Maven配置私服仓库

    首先就是,最基本的打开maven的配置文件,上面是我自己的习惯,多留一个以备不坏 打开setting配置文件,来修改路径(本人不习惯将所有软件放在C盘,一般都是单独存放盘) 接下来就是公司给你的账户和 ...

  5. Linux学习4-远程登录管理工具安装

    1.配置虚拟机网络环境 桥接模式:使用真实网卡进行通信,配置简单,可以和通往内的其他真实机直接进行通讯,缺点是它会占用网段的一个IP地址. NAT模式:使用虚拟机模拟的虚拟网卡进行通讯,会使用VMne ...

  6. Python Django migrate 报错解决办法

    1. 在现有基础上又添加一个表的时候migrate报错 migrate报错django.db.utils.OperationalError: (1050, "Table 'cmdb_eidc ...

  7. MySQL 报错

    SELECT COUNT(1) FROM (select tid from teacher where tname like '李%') 1248 - Every derived table must ...

  8. 左连接sql

    <?php public function sumZong($id){ $sql =' SELECT * FROM vvt_league_user AS p Left join vvt_leag ...

  9. Code Signal_练习题_All Longest Strings

    Given an array of strings, return another array containing all of its longest strings. Example For i ...

  10. FileReader读取文件

    前言:FileReader是一种异步文件读取机制,结合input:file可以很方便的读取本地文件. input:file 在介绍FileReader之前,先简单介绍input的file类型. < ...