步步為營-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(, "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 運行效果

步步為營-97-MyMVC3的更多相关文章
- 步步為營-96-MyMVC2
說明:地址欄中的URL還存在一些不足之處 地址欄中最好能是http"www.sss.com/asdf/aaa 1.1 模擬路由的原理:創建Routing文件夾,并添加URLRoutingMo ...
- 步步為營-95-MyMVC 1.0
說明:通過自己編寫MyMVC以便於對MVC內容實現機制有更深刻的認識 1.1:創建MyMVC項目,刪除無關引用,只保留system 和 system.web.同時該項目中以後添加一些文件后也要刪除無關 ...
- 步步為營-98-MyAPI
1 通过NuGet程序管理包添加 Microsoft Asp.Net webAPI 2.2 的引用 2 添加两个文件夹Controllers和Models 2.1 在本地模拟数据库,所以在Model ...
- From COM to COM 侯捷 1998.06.12
摘要: 本文簡介 C++ Object Model 和 Component Object Model 的基本概念,並引介四本書籍: 1. Inside The C++ Object Model 2. ...
- 超时空英雄传说2复仇魔神完全攻略&秘技
╓─╥───────────────────────────────────────────────────╥─╖ ║ ║ 超 時 空 英 雄 傳 說 2 ║ ║ ║ ║ --復 仇 魔 神-- ║ ...
- H TC並沒有成為下一個摩托羅拉或諾基亞。
關於2014年第四季度,H T C在三季度財報說明中提到,“年度旗艦H T CO ne(M 8)與中端機型H T C D esire系列在競爭日趨激烈的智能手機市場保持穩定的銷售,市占率有所提升,延續 ...
- 一步步教你读懂NET中IL(附带图)
一步步教你读懂NET中IL(附带图) 接触NET也有1年左右的时间了,NET的内部实现对我产生了很大的吸引力,在msdn上找到一篇关于NET的IL代码的图解说明,写的挺不错的.个人觉得:能对这些底部的 ...
- 一步步教你轻松学主成分分析PCA降维算法
一步步教你轻松学主成分分析PCA降维算法 (白宁超 2018年10月22日10:14:18) 摘要:主成分分析(英语:Principal components analysis,PCA)是一种分析.简 ...
- 一步步教你轻松学关联规则Apriori算法
一步步教你轻松学关联规则Apriori算法 (白宁超 2018年10月22日09:51:05) 摘要:先验算法(Apriori Algorithm)是关联规则学习的经典算法之一,常常应用在商业等诸多领 ...
随机推荐
- 搭建ubuntu14.04服务器必备环境
1. 设置网络 设置网络时,一定要设置好网卡,第一个网卡一定要设置为‘br0’(如下图),设置为其他的上不去网. 修改网络配置文件,命令:sudo gedit /etc/network/interf ...
- flask 连接mysql及基本操作
#导入第三方连接库sql点金术 from flask_sqlalchemy import SQLAlchemy #建立对象 app = Flask(__name__) #载入配置文件 app.conf ...
- Java 遍历List中删除的解决方法
- Invalid character found in the request target.
背景:springboot项目内置tomcat9.0 调用的接口中有{}就会报错 解决办法: 新的tomcat新版本增加了一个新特性,就是严格按照 RFC 3986规范进行访问解析,而 RFC 398 ...
- SpringSecurity认证处理流程
- 【原理】VRRP详解
写在前面 keepalived是一个基于VRRP协议来实现的服务高可用方案,从而可以避免IP单点故障.一般与其他负载均衡技术,如LVS,Nginx等一起来工作来达到集群高可用的目的 关于Keepali ...
- proc/net/dev实时网速统计实例【转】
转自:https://blog.csdn.net/dosthing/article/details/80384541 前言 网络编程是程序连接网络拓展的基础,尤其是在物联网.互联网加等概念火热的当下, ...
- 64位进程调用32位dll的解决方法 / 程序64位化带来的问题和思考
最近做在Windows XP X64,VS2005环境下做32位程序编译为64位程序的工作,遇到了一些64位编程中可能遇到的问题:如内联汇编(解决方法改为C/C++代码),long类型的变化,最关键的 ...
- Nginx负载均衡实例
upstream MyServers{ server 192.168.63.137; server 192.168.63.138; server 192.168.63.140; } server{ l ...
- percona mysql server5.7基于gtid的主从复制
配置mysql基于gtid主从复制架构 一.二进制安装mysql [root@node5 data]# --Linux.x86_64.ssl101.tar.gz [root@node5 data]# ...