說明: 解決另外一個不合理之處:通過控制器完成處理
1:在mvc文件夾下面添加一個工廠類文件DefaultControllerFactory
1.2進一步升級為抽象工廠
2 下一步如何規範Controller的內容
2.1 創建一個類RequestContext
2.2 醜行出一個接口
,2.3 創建一個抽象方法實現這個接口
using System;using System.Collections.Generic;using System.Linq;using System.Reflection;using System.Web; namespace YK.Simple.Mvc1.Mvc{ ???public abstract class ControllerBase:IController ???{ ???????protected HttpContext Context { get; set; } ???????protected IDictionary<string, object> RouteData { set; get; } ????????????????public virtual void Execute(RequestContext context) ???????{ ???????????Context = context.HttpContext; ???????????RouteData = context.RouteData; ???????????//獲取ActionName ???????????var actionName = RouteData["action"].ToString(); ???????????#region 找到Action方法對象 ???????????//先找到黨慶類中的所有方法 ???????????var methods = this.GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); ???????????MethodInfo method = null; ????????????foreach (var item in methods) ???????????{ ???????????????if (item.Name.Equals(actionName, StringComparison.InvariantCultureIgnoreCase)) ???????????????{ ???????????????????method = item; ???????????????????break; ???????????????} ???????????} ???????????if (method==null) ???????????{ ???????????????throw new HttpException(404, "Not Found"); ???????????} ????????????#endregion ???????????List<object> values = new List<object>(); ???????????var parameters = method.GetParameters(); ???????????foreach (var parameter in parameters) ???????????{ ???????????????var name = parameter.Name; ???????????????var type = parameter.ParameterType; ???????????????//參數來源 1:form 2:queryString 3:RouteData ???????????????var value = Context.Request[name]; ???????????????if (string.IsNullOrEmpty(value)) ???????????????{ ???????????????????value =RouteData.ContainsKey(name)?RouteData[name].ToString():null; ???????????????} ???????????????if (!string.IsNullOrEmpty(value)) ???????????????{ ???????????????????//值類型轉換 ???????????????????values.Add(Convert.ChangeType(value, type)); ???????????????} ???????????????else { ???????????????????values.Add(null); ???????????????} ???????????} ???????????method.Invoke(this, values.ToArray()); ???????} ????????????}}
2.4 創建控制器
運行效果
3 最後我們不能讓所有的Action都以void的形式返回
3.1 添加ActionResult
3.2 添加RequestContext類
3.3 修改ControllerBase
3.4
3.5 運行效果
步步為營-97-MyMVC3
原文地址:http://www.cnblogs.com/YK2012/p/7965537.html