码迷,mamicode.com
首页 > Web开发 > 详细

步步為營-97-MyMVC3

时间:2017-12-03 18:56:14      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:factory   namespace   using   play   open   public   ant   imp   div   

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

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 運行效果

技术分享图片

 

步步為營-97-MyMVC3

标签:factory   namespace   using   play   open   public   ant   imp   div   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!