在ASP.NET中实现Model-View-Controller模式(2)

asp.net|model

  模型-视图-控制器分离的重构

 为了解决上面所遗留的问题,你必须将模型与控制器角色分离。

 视图的实现代码与前部分相同。

 模型

 下面的代码例子使模型角色仅仅依赖于数据库,而不包含任何与视图相依赖的代码。

using System;

using System.Collections;

using System.Data;

using System.Data.SqlClient;

public class DatabaseGateway

{

public static DataSet GetRecordings()

{

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");

return ds;

}

public static DataSet GetTracks(string recordingId)

{

String selectCmd =

String.Format(

"select * from Track where recordingId = {0} order by id",

recordingId);

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");

return ds;

}

 现在的代码只依赖于数据库,这个类是一个优秀的数据库的通道,它持有访问表或视图的所用的SQL语句,其它的代码调用一些方法来完成与数据库的交互。

 控制器

 这种重构方式利用代码隐藏机制,在负责数据访问的模型部分相对独立的情况下,由控制器负责事件与方法的控制工作。模型的任务很明确的,它仅返回一个DataSet对象。这种实现方式就像视图代码一样,不依赖于数据是如何从数据库中返回的。

using System;

using System.Data;

using System.Collections;

using System.Web.UI.WebControls;

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)

{

DataSet ds = DatabaseGateway.GetRecordings();

recordingSelect.DataSource = ds;

recordingSelect.DataTextField = "title";

recordingSelect.DataValueField = "id";

recordingSelect.DataBind();

}

}

void SubmitBtn_Click(Object sender, EventArgs e)

{

DataSet ds =

DatabaseGateway.GetTracks(

(string)recordingSelect.SelectedItem.Value);

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

}

   测试

 将模型部分从ASP.NET环境中分离出来能够使模型部分更容易的被测试。在ASP.NET环境中进行测试的话,你必须同时测试很多方面,如HTML代码是否正确,而读取HTML代码的工作是非常烦闷的。将模型部分分离出来,使你能够对模型部分做单独的单元测试。下面是NUnit (http://nunit.org)对模型部分进行单元测试的例子。

using System;

using NUnit.Framework;

using System.Collections;

using System.Data;

using System.Data.SqlClient;

[TestFixture]

public class GatewayFixture

{

[Test]

public void Tracks1234Query()

{

DataSet ds = DatabaseGateway.GetTracks("1234");

Assertion.AssertEquals(10, ds.Tables["Track"].Rows.Count);

}

[Test]

public void Tracks2345Query()

{

DataSet ds = DatabaseGateway.GetTracks("2345");

Assertion.AssertEquals(3, ds.Tables["Track"].Rows.Count);

}

[Test]

public void Recordings()

{

DataSet ds = DatabaseGateway.GetRecordings();

Assertion.AssertEquals(4, ds.Tables["Recording"].Rows.Count);

DataTable recording = ds.Tables["Recording"];

Assertion.AssertEquals(4, recording.Rows.Count);

DataRow firstRow = recording.Rows[0];

string title = (string)firstRow["title"];

Assertion.AssertEquals("Up", title.Trim());

}

}

 结论:

 在ASP.NET中实现MVC模式有如下优缺点:

 优势:

 能够减少依赖。 程序员可以在一个ASP.NET页面中实现所有的代码。单页的实现方式,对于一些小型的且生存周期不长的程序是适用的。但如果想在不断增加的页面间共享代码的话,将代码的不同部分进行分离是非常有效果的。

 能够减少代码的复制。 DatabaseGateway 类中的GetRecordings 和 GetTracks方法能够直接被其它的页面使用,减少了必须将方法的代码拷贝到不同页面的情况。

 能够把不同人员的责任分开。修改页面的外观与修改数据访问的代码所用的技术是不同的,将模型与视图分开能够使负责不同工作的专家协同的工作。

 使性能优化的成为可能 按将系统不同的职责分成不同的类,使性能的优化成为可能。前面的例子中,由于每次请求页面的时都要从数据库中读取数据。因此可在某种情况下将数据缓存,从而提高整个程序的性能。如果不将代码进行分离的话是无法做到的这点的。

 易测试性 将模型与视图相分离使在ASP.NET环境外进行单元测试成为可能。

 缺点:

 增加了代码的数量及复杂度。这个例子在早期单页的实现方式的基础上增加了新的文件和代码,在无形中增加了维护的开销。一旦修改系统的话,会修改所有三种角色的代码。在一些情况下,一个文件中的修改比一些文件中修改要方便。所以在考虑是否使用MVC模式时。这种额外的开销一定要被计算在内,对一些小的程序来说,这种开销是不值得的。

时间: 2024-12-12 13:48:06

在ASP.NET中实现Model-View-Controller模式(2)的相关文章

asp.net-请问大家一个问题,ASP.NET中的MODEL层里的内容

问题描述 请问大家一个问题,ASP.NET中的MODEL层里的内容 请问大家一个问题,ASP.NET中的MODEL层里的内容,什么private,public的定义是自动生成的还是自己敲的? 解决方案 可以自动生成,也可以自己敲. 如果你用的是linq to sql或者ef dbfirst,那么可以根据数据库产生模型. 自己敲也不费事,你应该知道简化的语法吧. public int Value { get; set; } //不需要private字段 或者 public int Value {

ASP.NET中MultiView和View选项卡控件的使用方法_基础应用

MultiView 控件可用作一个或多个 View 控件的外部容器.而 View 控件可以包含标记和控件的任意组合.您可以使用 MultiView 和 View 控件来执行各种任务,例如基于用户选择提供替换控件集或者创建多页表单. MultiView 控件一次显示一个 View 控件,并公开该 View 控件内的标记和控件.通过设置 MultiView 控件的 ActiveViewIndex 属性,可以指定当前可见的 View 控件. 如果要切换视图,可以使用控件的ID或者View控件的索引值.

view controller内部全部视图旋转

iOS屏幕旋转控制在View Controller里面,包含三种controller.    其一:UIViewController及其子类.    其二:UINavigationController及其子类.    其三:UITabBarController及其子类.    每一种controller及其子类都可以写屏幕旋转控制代码.但是记住一个原则,谁加载谁获得屏幕控制的权限,被加载的controller如果要添加自适应代码,可以在- (void)willRotateToInterfaceO

MVVM模式中ViewModel和View、Model有什么区别?

  这篇文章主要介绍了MVVM模式中ViewModel和View.Model有什么区别?本文分别解释了它们的功能和作用,然后总结了它之间的区别,需要的朋友可以参考下 Model:很简单,就是业务逻辑相关的数据对象,通常从数据库映射而来,我们可以说是与数据库对应的model. View:也很简单,就是展现出来的用户界面. 基本上,绝大多数软件所做的工作无非就是从数据存储中读出数据,展现到用户界面上,然后从用户界面接收输入,写入到数据存储里面去.所以,对于数据存储(model)和界面(view)这两

一起谈.NET技术,ASP.NET MVC中对Model进行分步验证的解决方法

在我之前的文章:ASP.NET MVC2.0结合WF4.0实现用户多步注册流程中将一个用户的注册分成了四步,而这四个步骤都是在完善一个Model的信息,但是又分页面填写信息的,当时我加上ModelState.IsValid这句验证代码的时候,根本没法通过验证,因为在注册的前面三步,注册用户的Model信息都没填写完整,而ModelState.IsValid是对一个实体的所有属性进行判断验证的.当时很纠结,因为刚接触Asp.net MVC,故没有找到解决方案.这篇文章将给出解决的办法.看下面需要验

在 ASP.NET 中实现 Page Controller

asp.net 您要在 ASP.NET 中构建 Web 应用程序,您希望通过使用内置的 Page Controller(页面控制器)来利用 ASP.NET 的事件驱动特性. 实现策略 默认情况下,Page Controller 模式中所描述的概念是在 ASP.NET 中实现的.ASP.NET 页面框架实现这些概念所采取的方式使得在客户端上捕获事件.将其传输到服务器并调用适当方法这一系列操作的基本机制是自动进行的,并且对实现者来说是不可见的.页面控制器是可扩展的,因为它会在生命周期的特定点上公开各

asp.net-怎么更改ASP中的tree view 控件里的文字

问题描述 怎么更改ASP中的tree view 控件里的文字 怎么更改ASP中的tree view 控件里的文字,老是改不掉 解决方案 直接修改 treeView1.Nodes[n],Text = xxx 看下你的控件有没有回发,服务器上page_load有没有判断 if (!postback) { 初始化 } 解决方案二: 谢谢,但是你这种方法有点烦,我找到了另一种方法,谢谢

浅谈ASP.NET中多层架构

  Asp.net的多层架构主要是为了解决数据层,逻辑层,表示层等之间的关系.我的做法是这样的:首先建立一个DataCore的基类.基类里面封装了一些低层的数据库的基本操作,比如说数据库联接,调用存储过程等等. 很多人对开发多层应用程序感到一定的困难.来看一个例子:对于一个只有一两个人的小公司,一个人可能同时担当老板.出纳.会计.市场.销售.开发等多项工作.而对于一个大公司,就会进行比较严密的分工,每个人只完成一部分工作,需要彼此配合才能保证正常运转.以前的开发程序就类似于一个小公司,从用户界面

asp.net中mvc使用ajax提交参数的匹配问题解决探讨

本文为大家介绍下使用javaScript解决asp.net中mvc使用ajax提交参数的匹配问题,遇到类似情况的朋友可以参考下,希望对大家有所帮助   想到在asp.net的mvc中如果使用ajax向服务端传递参数时如果参数是一个类或者是个数组(或List集合)以及更复杂的对象时,服务端总是会发 生取不到值的情况,当然网上也有很多解决的例子,但都是在服务端想办法来解决的(比如将json转换为字符串,再在服务端反序列化为一个对象),为何不能 在客户端就把这个问题搞定. 其实问题没那么复杂,那是因为

ASP.NET MVC的Model元数据与Model模板:将”ListControl”引入ASP.NET MVC

我们不仅可以创建相应的模板来根据Model元数据控制种类型的数据在UI界面上的呈现方法,还可以通过一些扩展来控制Model元数据本身.在某些情况下通过这两者的结合往往可以解决很多特殊数据的呈现问题,我们接下来演示的实例就是典型的例子.[本文已经同步到<How ASP.NET MVC Works?>中] 传统的ASP.NET具有一组重要的控件类型叫做列表控件(ListControl),它的子类包括DropDownList.ListBox.RadioButtonList和CheckBoxList等