步步為營-97-MyMVC3

MVC框架控制器设计
本文详细介绍了在MVC架构中创建控制器的过程,包括抽象工厂模式的应用、RequestContext类的设计及ActionResult的实现,确保了控制器的有效性和灵活性。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值