在ASP.Net MVC框架中是使用地址攔截的,雖然很好用,但是裝起來太大了,配置也麻煩。本文通過代碼實踐,在ASP.Net2.0框架下實現一套簡易的MVC框架。MVC框架難於構建的地方在於Controller與VIEw的分離以及分離後數據可以方便地傳輸。為了保持代碼的簡潔,將使用ashx文件作為Controller,用ASPx頁面作為VIEw。
講起來比較費勁,把項目文件放上來,而下面只作一個簡單的說明。項目是VS2008的項目,大小15K。
下載地址:DotNetMVC.rar
首先構建一個Controller基類。
以下為引用的內容:
Controller類
/**
* author : yurow
* http://birdshover.cnblogs.com
* description:
*
* history : created by yurow 2009-9-20 7:30:04
*/
using System.Web;
using System.Web.Services;
namespace DotNetMVC.MVC {
/// <summary>
/// 控制器
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public abstract class Controller<T, K> : IHttpHandler {
/// <summary>
/// 當前請求
/// </summary>
protected MyRequest Request;
/// <summary>
/// 輸出
/// </summary>
protected HttpResponse Response;
/// <summary>
/// 返回到VIEw頁面的數據
/// </summary>
protected MvcViewData<T, K> VIEwData;
/// <summary>
/// 控制器名稱
/// </summary>
private string controllerName;
/// <summary>
/// 控制器操作方法
/// </summary>
public abstract void Action();
/// <summary>
/// 執行請求
/// </summary>
/// <param name="context"></param>
public void ProcessRequest(HttpContext context) {
Request = context.Request;
Response = context.Response;
//這裡可以用反射的方式進行帶參數的操作,這裡為了簡化,去掉了這部分
//MethodInfo method = this.GetType().GetMethod("Action", new Type[0]);
//if (method == null) {
// throw new NotImplementedException("沒有實現!");
//}
//object data = method.Invoke(this, null) as object;
ViewData = new MvcVIEwData<T, K>();
Action();
context.Items.Add("MvcViewData", VIEwData);
context.Server.Transfer("~/VIEw/" + ControllerName + ".ASPx", false);
}
/// <summary>
/// 控制名稱,不設置默認為VIEw頁面與控制器名稱同名
/// 比如,在Login.ashx請求中,默認調用VIEw/Login.ASPx的頁面作為顯示頁面。
/// 當登錄成功後,設置其為LoginOK,則會調用VIEw/LoginOK.ASPx
/// </summary>
protected string ControllerName {
get {
if (string.IsNullOrEmpty(controllerName))
return this.GetType().Name;
return controllerName;
}
set {
controllerName = value;
}
}
public bool IsReusable {
get {
return false;
}
}
}
}
Controller在ProcessRequest方法中調用ASPx頁面,裡面設置了一個虛方法Action在具體的ashx文件中重載。
下面是Default.ashx.cs文件的寫法
以下為引用的內容:
Default
sing DotNetMVC.MVC;
namespace DotNetMVC {
/// <summary>
/// $codebehindclassname$ 的摘要說明
/// </summary>
public class Default : Controller<string, string> {
public override void Action() {
}
}
}
在Controller中,還有兩個重要的東西一個是傳遞給View數據用的,一個是顯示哪個VIEw的(通過ControllerName這個屬性)
原文地址:http://www.cnblogs.com/birdshover/archive/2009/09/20/1570552.Html