- 浏览: 203359 次
- 性别:
- 来自: 广州
-
最新评论
-
gurudk:
有很多好的产品也是集体智慧的结晶,不是带有个人色彩。
谈谈架构师 -
司马崖余:
2、编程提高
a. 基础知识
b. oop和设 ...
关于团队培训 -
司马崖余:
什么时候实施啊?期待中:D
寻求下一个阶段的团队爆发点 -
17studio:
ncache是在请求分发模块做的事情
分布式文件存储方案 -
17studio:
cpu是小事,中心数据做好同步,机器可以横向扩展,关键的扩展点 ...
resin 3.2 comet
微软不愧为巨头级别的软件开发商, 别人都要另外开发的库, 它在产品中就直接集成了
asp.net内嵌支持MVC, 使用事件响应型的机制, 提供了开发人员直观的开发感受, 事件机制是view和m, c分离的基础, 而且直观,虽然我并不用asp.net, 但是做为asp的曾经开发者, 还是应该回顾一下的
下面是参考资料
MVC模式形容这种实现方式是一种被动的实现机制,ASP.NET充当了程序执行中的控制器的角色,但程序员必须将具体的事件处理方法添加到事件的响应函数中。如在这个例子中,控制器在页面加载之前调用Page_Load函数并执行其中的代码,当用户点击Submit按钮时由系统调用SubmitBtn_Click函数并执行。
这种将代码都包含在一个文件中的实现方式非常的直接,而且当应用程序很小并不经常修改的时候也可以说是一种好的方法,但是如果下面的一些情况出现的话你也许会开始考虑修改这种实现方法:
使编程的工作并行并减少由此带来的发生错误的可能性。为了增加工作的并行性,提高效率,你可能想让不同的人编写视图的代码及模型代码并尽力减少这种工作方式所带来的出错的可能性。例如:当所有的代码都在一个文件中的话,那么一个编程人员可能会在改变DataGrid显示格式的时候无意中修改数据访问的代码。这种错误是很难被发现的,直到页面整体被编译的时候才会显现出来。。
使你的数据访问代码在其它页面中重用。在这种单文件的实现方式中,除了拷贝代码,没有其它的方法能够做到代码的重用。拷贝的代码是很难被维护的,因为一旦代码发生了变化,你必须在所有的页面都进行修改。
为了避免上面这些情况的发生,ASP.NET引入了代码分离(Code-behind)机制。
用代码分离机制进行重构
Microsoft Visual Studio .NET中的代码分离机制使视图层的代码与模型及控制器的代码能够很容易的分离。每个ASP.NET页面都有一种机制,能够使其要调用的方法在一个与其分离的类中实现。这种方式使用起来非常的方便,而且也可以利用Visual Studio .NET中的一些其它特性共同完成开发工作。比如如当你利用代码分离的机制开发你的页面的时候,可以利用智能感知(IntelliSense technology)显示出一个可用方法的列表方便编程。而智能感知技术在.aspx页面中是不能使用的。
下面给出的是上面例子利用代码分离机制的实现。
视图部分:
视图层的代码现在一个单独的文件中实现。Solution.aspx:
<%@ Page language="c#" Codebehind="Solution.aspx.cs"
AutoEventWireup="false" Inherits="Solution" %>
<html>
<head>
<title>Solution</title>
</head>
<body>
<form id="Solution" method="post" runat="server">
<h3>Recordings</h3>
Select a Recording:<br/>
<asp:dropdownlist id="recordingSelect" runat="server" />
<asp:button id="submit" runat="server" text="Submit"
enableviewstate="False" />
<p/>
<asp:datagrid id="MyDataGrid" runat="server" width="700"
backcolor="#ccccff" bordercolor="black" showfooter="false"
cellpadding="3" cellspacing="0" font-name="Verdana" font-size="8pt"
headerstyle-backcolor="#aaaadd" enableviewstate="false" />
</form>
</body>
</html>
大部分代码都与前面的解决方案的代码相同。主要的不同点是第一行:
<%@ Page language="c#" Codebehind="Solution.aspx.cs"
AutoEventWireup="false" Inherits="Solution" %>
这行告诉ASP.NET执行环境,这个页面的具体实现机制在一个单独的类中。因为这个页面是独立的,因此如果数据访问的代码发生变化,这个页面并不需要做任何改动。同样,一些设计师也可以改变这个页面的代码而不会引起任何数据访问的错误。
在ASP.NET中实现Model-View-Controller模式(三)
模型及控制器部分:
这个解决方案的第二个部分是被隐藏的后台代码:
using System;
using System.Data;
using System.Data.SqlClient;
public class Solution : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button submit;
protected System.Web.UI.WebControls.DataGrid MyDataGrid;
protected System.Web.UI.WebControls.DropDownList recordingSelect;
private void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{
String selectCmd = "select * from Recording";
SqlConnection myConnection =
new SqlConnection(
"server=(local);database=recordings;Trusted_Connection=yes");
SqlDataAdapter myCommand = new SqlDataAdapter(selectCmd, myConnection);
DataSet ds = new DataSet();
myCommand.Fill(ds, "Recording");
recordingSelect.DataSource = ds;
recordingSelect.DataTextField = "title";
recordingSelect.DataValueField = "id";
recordingSelect.DataBind();
}
}
void SubmitBtn_Click(Object sender, EventArgs e)
{
String selectCmd =
String.Format(
"select * from Track where recordingId = {0} order by id",
(string)recordingSelect.SelectedItem.Value);
SqlConnection myConnection =
new SqlConnection(
"server=(local);database=recordings;Trusted_Connection=yes");
SqlDataAdapter myCommand = new SqlDataAdapter(selectCmd, myConnection);
DataSet ds = new DataSet();
myCommand.Fill(ds, "Track");
MyDataGrid.DataSource = ds;
MyDataGrid.DataBind();
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.submit.Click += new System.EventHandler(this.SubmitBtn_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
这里将代码从上个实现方法单独的文件移动到了一个它自己的文件中。并通过一些机制把视图以及模型控制器这两个部分连接成一个整体,如这个类中的成员变量与Solution.aspx文件中所用的控件是同名的。另外一个必须显示指出的是控制器如何将行为与其所对应的事件进行连接。在这个例子中InitializeComponent函数连接了两个事件。第一个将Load事件与 Page_Load函数连接,第二个是Click事件,当Submit按钮被点击时调用SubmitBtn_Click函数。
代码分离是一种将视图部分与模型及控制器部分相分离的一种优秀的机制。但当你想把分离出的后台的代码给其它页面重用时可能还是不足的。在技术上,将页面背后的代码复用是可行的,但随着你需要共享的页面的增加,把页面与后台代码相连接是很困难的。
在ASP.NET中实现Model-View-Controller模式(二)
发表评论
-
webgame项目开发相关阶段
2011-01-12 14:58 1065首先定义webgame项目: 1、webgame 2、有核心玩 ... -
我认为良好的代码设计
2010-03-29 13:23 1497我认为良好的代码设计,在于以下几个标准: 1、能够满足需求的 ... -
hibernate对象实现对象互动(如接口调用)的几种方法
2009-10-21 18:07 1100前提: 1、hibernate对象 ... -
设计模式行为型模式应用场景
2009-10-15 17:15 1013简化交互关系:命令模式、观察者模式 增强交互的信息包含量:解 ... -
分布系统设计的小记
2009-10-14 12:03 868把以前学习分布式数据库时候的一点理论通俗化一下。 以下三者不 ... -
设计模式创建型模式应用场景
2009-10-12 16:05 1121创建型模式常用的是factory、builder和protot ... -
设计模式结构型模式应用场景
2009-10-12 12:06 982从简化角度出发: 1. 减少对象数目(adaptor) 2. ... -
ruby常用全局变量
2009-09-01 14:22 1251$! 最近一次的错误信息 $@ 错误产生的位置 $_ ge ... -
编程思想的一些小记
2009-08-11 11:46 8951. 过程式 2. 数据结构化 3. 面向对象编程 4. 设计 ... -
JVM 参数设置详细说明(转)
2009-08-09 21:18 4084JVM 参数设置详细说明(转) 1: heap size ... -
记一下同事的BLOG
2009-06-29 15:40 822http://blog.chinaunix.net/u3/98 ... -
一些用于工具类程序的升级建议
2009-06-23 17:09 668重要版本的升级,可以先收集用户的意见(参考如netbeans在 ... -
Linux系统的常用操作命令大全
2009-05-28 07:46 1015系统 # uname -a ... -
linux信号表
2009-05-22 23:53 1564名称 默认 ... -
哪些是java不能做到的?
2008-12-16 08:46 1151最近在思考平台组的工作时,必须面临的一个问题,如何为组员提供将 ... -
系统需要监控信息
2008-12-08 13:00 11381. 硬件级别 a. 网络流量,机房间的通畅情况 ... -
或许要放弃jruby了
2008-11-12 00:39 940ruby 被团队所喜爱,但是真正把ruby做到系统里面的时候, ... -
全局变量的使用
2008-10-17 13:47 960我们不可避免要使用到全局变量,在程序设计里面,哪些情况是合理的 ... -
B/S架构特点
2008-10-17 11:11 12651. 应用无状态 2. 非即时 3. 交互通过数据交互完成 ... -
对下一代互联网架构的感悟
2008-09-30 22:43 10171. 关键模块使用高性能方案实施 2. 业务开发插件化,应用化 ...
相关推荐
初中语文文学讨论名著导读旧文新读感慨时光 和吴越先生在一起
【华硕服务器在文新传媒信息化建设中的应用】 华硕服务器在文新传媒信息化建设中发挥了关键作用,其中,华硕RS520-E6是一款针对机柜优化的2U机架式服务器,专为强化新闻采编系统的建设而选用。这款服务器基于Intel...
个人工作总结范文新.doc
房屋漏水起诉书范文新.pdf
2020医生述职报告范文新素材.docx
寒假实习总结范文新5篇.docx
文明养犬文新中队PPT学习教案.pptx
2021个人述职报告范文新五篇.docx
例如,通过对一系列等式的观察(如1^2 = 1, 1^2 - 2^2 = -3, ...),可以归纳出第n个等式的一般形式,即1^2 - 2^2 + 3^2 - 4^2 + ... + (-1)^(n+1)*n^2 = (-1)^(n+1)*n*(n+1)/2。这种思维方式在解决数学问题时能帮助...
2. **履行期限、地点、进度安排**: - 规定了合同的执行时间表,包括项目的开始和结束日期,以及不同阶段的工作进度。履行地点一般指研发活动的主要实施地。 3. **开发费用及支付**: - 描述了项目开发的总费用,...
【甲骨文、金文新释两则】这篇文章主要探讨了甲骨文和金文中的两个关键人物身份的再解析,对于理解古代历史和文化具有重要意义。文章首先聚焦于周原甲骨文H11:11,通过对该片卜辞的重新审视,作者提出其中的人名“更...
例如,如果给定的是形如 \( f(x) = x^2 + y^2 - 2xy \) 的函数,可以转化为 \( f(x) = (x - y)^2 \),然后利用 \( (x - y)^2 \geq 0 \) 来求最值。 3. **等号成立条件**:确定何时等号成立是非常关键的,因为这将...
- 在电解过程中,正极产生氧气,负极产生氢气,两者体积比为1:2。 4. **物质的分类实例**: - 臭氧(O3)是单质,因为它只含有一种元素。 - 水(H2O)是纯净物,同时属于化合物和氧化物,因为它由两种元素组成,...
2. **项目管理知识体系** - 美国项目管理学会(PMI)的PMBOK提供了项目管理的标准框架,包括项目计划、组织、质量、费用和进度控制等方面。 - 国际项目管理协会(IPMA)的ICB定义了项目管理人员的能力基准。 - 中国的...
【考研复试英语自我介绍范文新精选】 在考研的复试阶段,英语自我介绍是展示考生语言能力和个人特质的重要环节。一篇精心准备的自我介绍可以帮助考生在众多竞争者中脱颖而出。以下是一份新的考研复试英语自我介绍...
4. **贷款期限与利率**:合同明确了借款的期限和利率,如遇国家调整存贷款利率,合同将根据相关规定调整还款金额。 5. **还款计划**:借款人需按照约定的日期按月归还本息。 6. **逾期处理**:如果借款人未能按时...
针对NAT环境下参与用户网络类型、网络状况往往不一致的情况,提出一种动态节点转发的实时多媒体数据传输技术。采用数据发送节点基于最优节点路由算法将数据发送给多媒体系统中的某些节点,然后由这些节点及下一批被...
2. 协助律师工作:参与当事人会见,了解律师与当事人沟通的技巧和策略;跟随律师开庭,观察法庭辩论,学习如何组织证据和记录要点。 3. 法律文书写作:通过撰写各类法律文书(如起诉状、答辩状、上诉状等),提升...
高考数学文新思维二轮课件:第一部分送分专题第3讲不等式及线性规划.docx
教育精品资料