步步為營-97-MyMVC3

說明: 解決另外一個不合理之處:通過控制器完成處理

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());
        }

         
    }
}
View Code

 2.4 創建控制器

運行效果 

 3 最後我們不能讓所有的Action都以void的形式返回

3.1 添加ActionResult

3.2 添加RequestContext類

3.3 修改ControllerBase

 

 3.4

3.5 運行效果

原文地址:https://www.cnblogs.com/YK2012/p/7965537.html