在ASP.NET中实现MVC模式(四)

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

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

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

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

模型

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

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

}

 

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

mutou23

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值