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("", "张三", "男", 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的更多相关文章
- 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 ...
- asp.net MVC4 框架揭秘 读书笔记系列1
1.1 传统MVC 名词解释 Autonomous View. AV. 自制视图 GUI图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式 ...
- ASP.NET MVC5框架揭秘 学习笔记01
1.自治视图 在早期(作者也没说明是多早,自己猜吧),我们倾向于将所有与UI相关的操作糅合在一起(现在我身边还有很多人这样做),这些操作包括UI界面的呈现. 用户交互操作的捕捉与响应(UI处理逻辑). ...
- Android 框架揭秘 --读书笔记
Android 框架揭秘 Insied the Android Framework
- ASP.NET WEB API 2 框架揭秘 读书笔记(一)
第一章 概述 主要内容是介绍Web的基本概念,Restfull的基本概念及特性.最后介绍创建简单WebApi程序的步骤. Web的基本概念 IP/TCP协议簇分层,分为两种 链路层->网络层-& ...
- ASP.NET MVC4框架揭秘 源代码下载
http://files.cnblogs.com/artech/asp.net.mvc.4.samples.rar
- 《ASP.NET Core In Action》读书笔记系列,这是一个手把手的从零开始的教学系列目录
最近打算系统学习一下asp.net core ,苦于没有好的中文书藉,只好找来一本英文的 <ASP.NET Core In Action>学习.我和多数人一样,学习英文会明显慢于中文.希 ...
- C#刨根究底:《你必须知道的.NET》读书笔记系列
一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...
- C#温故知新:《C#图解教程》读书笔记系列
一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...
随机推荐
- android学习-ndk-build(androidstudio编译cocos2d-x库的cpp为so文件的解释)
本文不作为ndk初学使用,只是对cpp等c++文件编译成so文件的过程中,参数含义,及ndk配置的解释.使用的技术比较旧. androidStudio使用gradle调用ndk-build工具编译c+ ...
- redis-springdata-api
使用StringRedisTempalte操作redis五种数据类型 spring-data中继承了redisTemplate, 提供redis非切片连接池 代码github地址: https://g ...
- CentOS SVN Failed to load JavaHL Library
在CentOS 6上的eclipse安装了svbclipse插件后,svn不能使用,并且第一次使用的时候还出现下面错误窗口提示 Failed to load JavaHL Library. These ...
- [CQOI 2018]解锁屏幕
Description 题库链接 给出平面上 \(n\) 个点,一开始你可以选任何一个点作为起点,接着对于每一个你在的位置,你可以选取一个未走过的点.将路径(线段)上所有的点均选上(包括起点终点),并 ...
- C#中const 和 readonly 修饰符的用法详解
1.const是不变常量,在编译的时候就需要有确定的值,只能用于数值和字符串,或者引用类型只能为null.(这里为什么要把字符串单独拿出来?是因为字符串string是引用类型,但是使用的时候却感觉是值 ...
- emberjs 按年月分组
一个集合,里面有年和月的属性,按照年和月进行分组显示数据 + item.TopicMonth }).map(function (value, key) { return { time: { year: ...
- js中var与let
问题 for (var iii = 0; iii < 3; iii++) { setTimeout(function(){ console.debug(iii) }, 1000) let let ...
- ASP.NET Core 2 学习笔记(十)视图
ASP.NET Core MVC中的Views是负责网页显示,将数据一并渲染至UI包含HTML.CSS等.并能痛过Razor语法在*.cshtml中写渲染画面的程序逻辑.本篇将介绍ASP.NET Co ...
- JavaScript之Array
JavaScript是一门非常灵活的动态语言,涵盖的内容也挺多,<JavaScript高级程序设计>看了也有两遍,但是在实际开发的时候,还是有很多东西记不清,然后还得去翻书,特别是一些Ar ...
- (文章也有问题,请自行跳过)react中的状态机每次setState都是重新创建新的对象,如需取值,应该在render中处理。
demo如下 class Demo4StateLearn extends React.Component { constructor(props) { super(props); this.state ...