zoukankan      html  css  js  c++  java
  • 步步為營-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 運行效果

  • 相关阅读:
    vue中使用router全局守卫实现页面拦截
    Java入门之Maven创建Web项目
    Java入门之Maven安装并集成IDE
    Java入门之IDE配置Tomcat
    Java入门之Tomcat运行
    Java入门之Tomcat安装及环境变量配置
    Java入门之IDE集成开发环境安装及配置
    Java入门之JDK安装及环境变量配置
    查看SQL Server中的锁表及解锁
    DES加密解密
  • 原文地址:https://www.cnblogs.com/YK2012/p/7965537.html
Copyright © 2011-2022 走看看