步步為營-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)是关联规则学习的经典算法之一,常常应用在商业等诸多领 ...
随机推荐
- CentOS7 设置主机名及IP映射
1.设置主机名 查看本机的主机名,使用如下三个命令中任意一个即可 # hostname # uname -n # cat /proc/sys/kernel/hostname 使用 vi 编辑器打开 / ...
- openstack Q版部署-----虚拟机创建(8)
一 .创建网络环境 环境变量生效一下 创建一个网络: openstack network create --share --external \ --provider-physical-network ...
- POI 海量数据/大数据文件生成SXSSFWorkbook使用简介
在之前我们知道处理xls的excel用的workbook是HSSFWorkbook,处理xlsx的excel用的是XSSFWorkbook. 上面两个类导出excel的时候数据会驻留在内存中,所以当数 ...
- [转] 如何轻松愉快地理解条件随机场(CRF)?
原文链接:https://www.jianshu.com/p/55755fc649b1 如何轻松愉快地理解条件随机场(CRF)? 理解条件随机场最好的办法就是用一个现实的例子来说明它.但是目前中文 ...
- SpringSecurityOAuth认证配置及Token的存储
⒈pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- Linker Scripts3--简单的链接脚本命令2-Assigning Values to Symbols
1.前言 本章继续讲述简单脚本命令的后半部分 2.Assigning Values to Symbols 你可以给一个符号(symbol)赋值,它会把这些定义的符号放入全局符号表(symbols ta ...
- struts2框架学习之第二天
day02 下面是在每个Action之前都会执行的拦截器,这段代码来自与struts-default.xml文件. <interceptor-stack name="defaultSt ...
- 002_运维SOP
一. <1>SOP:运维工作的标准化 <2>回滚:代码回滚 <3>降级:是利用有限资源,保障系统核心功能高可用.有损的架构方法 <4>多活切换:多机房切 ...
- mysql alter add 使用记录
alter add命令用来增加表的字段. alter add命令格式:alter table 表名 add字段 类型 其他; 例如,在表MyClass中添加了一个字段passtest,类型为int(4 ...
- PDF阅读器中如何改变线条颜色、线宽和线型等
1.打开PDF阅读器过后,点击菜单栏"注释"这一栏,找到绘图区域中的线条或铅笔: 2.分别用线条和铅笔随意画两条直线,然后选中直线,右键点击直线并打开"属性": ...