步步為營-97-MyMVC3
說明: 解決另外一個不合理之處:通過控制器完成處理
1:在mvc文件夾下面添加一個工廠類文件DefaultControllerFactory
1.2進一步升級為抽象工廠
2 下一步如何規範Controller的內容
2.1 創建一個類RequestContext
2.2 醜行出一個接口
,2.3 創建一個抽象方法實現這個接口
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 運行效果