一些废话:在北京辞职回家不知不觉中已经半年多了,这半年中有过很多的彷徨,困惑,还有些小小难受。半年时间算是我人生以来遇到过的最困苦的时候。理想的工作跟我擦肩而过,驾照也没有考过,年后这一改革...,毕竟遇到多大的阻力就有多大的成长,感觉这半年自己也成长了不少,不是刚出校门桀骜不驯的牛犊,也不是在北京每个月拿4000多块,然后月光的毕业生。自始至终,我对于技术的追求也并没有松懈过,最近一段时间也根据自己小小的想法,与以前公司的一个框架原理,通过Asp.Net MVC为基础半实现(为什么是半实现?因为还没写完!汗!。为什么没用“开发”一词,感觉自己技术还没到。)了一个小小的框架,希望我这以小小的瓦片能引出您的珍珠碗。

我所希望的:这框架其实想法有想法到现在基础的实现,已经有三个月了,由于断断续续的coding,到现在才写成博客。写成博客的目的,不是在此炫耀,也不是在此哗众取宠,而是真心的希望各位大牛,给小菜批评佐证,可以说是欢迎来拍砖,但是把您宝贵的意见留下,小菜在此跪谢!以下言归正传。

    一.框架的目的与原理:

 目的:根据Asp.Net MVC框架原理为基础,实现基于配置的MVC应用框架,最终以框架为基础,快速高效的应用与BS的开发。一个新的业务不需要构建C#的代码,不写

Controller与Action,只需要配置View与Mod.Config.而View的显示只可以根据已定义的分布视图,或是完全自定的View界面实现。实现高效的开发。

原理:众所周知Asp.Net MVC 框架根据用户的URL找到Controller并通过Action调用加载数据,并返回View。该框架的原理,是通过一个带参数的固定的Controller

动态解析,传入的URL,并根据URL参数,动态的创建出数据库操作实例,根据Mod.config文件,动态的加载每个Action的数据实例,返回以数据实例显示View,而View中的数

据显示啊,操作等通过分部页功能实现。

二.框架的架构

具体的操作请求实例:

下面通过一个请求,具体的解析一下怎样定位一个请求操作。

程序的主界面是自定义编译过的Ext只保留布局功能(Ext-all.js,Ext-base.js,+css总共大小280K左右,比原版的800K压缩了不少),以下是图:

以角色管理为例子:传入的URL 为解析后为

可以看到URL中并没有RBAC 的 Controller 也没有 Roles的 Action,所有Controller与Action都是通过BaseController与Load Action来加载,根据url参数创建出操作数据库实体类,并通过Url参数找到对应的View下面的文件目录,将每个Action与View使用的数据存入Mod.config文件中,每次访问一个Action时都回去Mod.config取出数据的实例,Mod.config是自定义的ConfigSection,就以“角色管理为例子”它配置了一个GridView分页需要使用的数据,Code:

 1 <ModelConfiguration>
2 <views>
3 <view name="Roles" title="首页">
4 <models>
5 <model type="GridModel" name="AjaxGrid1" >
6 <attributes>
7 <add name="Table" value="RBAC_Roles" />
8 <add name="JsonHeader" value="[{'N':'序号','W':'30','I':'false'},{'N':'操作','W':'80','I':'false'},{'N':'主键','W':'280'},{'N':'角色名'},{'N':'可用','W':'80'}]" />
9 <add name="JsonField" value="[{'N':'RowNumber'},{'I':'false','N':'@Edit=编辑'},{'N':'PKey'},{'N':'RoleName'},{'N':'Enable'}]" />
10 <add name="Where" value=" 1=1 " />
11 <add name="Order" value="PKey" />
12 <add name="PageSize" value="10" />
13 <add name="Key" value="PKey" />
14 </attributes>
15 </model>
16 </models>
17 </view>
18 </views>
19 </ModelConfiguration>

根据Mod.config的配置信息,生成数据模型,利用反射与缓存,加载数据信息,Code:

   ViewElement viewModels = GetCachedViewElement(filePath, actionName);
if (viewModels != null)
{
foreach (ModelElement model in viewModels.Models)
{
object virtualModel = new object();
virtualModel = Assembly.Load(modelAssembly).CreateInstance(modelAssembly + "." + model.Type);
foreach (AttributeElement attribute in model.Attributes)
{
AttributeReflecter.SetPropertyValue(virtualModel, attribute.Name, attribute.Value);
}
Database a = DatabaseFactory.CreateDatabase("Sys");
(virtualModel as IExecute).Execute(a);
ViewData[model.Name] = virtualModel;
}
}

返回视图:

所使用的分部页:

@using Binary.MVC.Library.Extends
@model Binary.MVC.Library.Model.GridModel <table id="GridView">
<thead>
<tr>
@foreach (Binary.MVC.Library.Model.HeaderModel header in Model.HeaderMC)
{
<th width="@header.W">@header.N@if(header.I){<img align="absmiddle" src="@Url.Content("http://www.cnblogs.com/Content/Images/rarrow.gif")" title="单击此处以排序" />}</th>
}
</tr>
</thead>
<tbody>
@foreach (Binary.MVC.Library.Model.GridRow row in Model.Rows)
{
<tr>
@foreach (Binary.MVC.Library.Model.FieldModel field in Model.FieldMC)
{
if (field.I)
{
<td>@row[field.N]</td>
}
else
{
<td>@Html.RenderGridAction(row.PKey,field.N)</td>
}
}
</tr>
}
@if (Model.ShowEmpty)
{
for (int i = 0; i < Model.PageSize - Model.PageCount; i++)
{
<tr>
@foreach(Binary.MVC.Library.Model.FieldModel field in Model.FieldMC)
{
<td>&nbsp</td>
}
</tr>
}
}
</tbody>
<tfoot>
<tr><td colspan="@Model.FieldMC.Count">
<table id="GridView-footer"><tr>
<td align="left">
<a title="第一页"><img src="http://www.cnblogs.com/http://www.cnblogs.com/Content/Images/pg-first.gif"/></a>
<a title="前一页"><img src="http://www.cnblogs.com/http://www.cnblogs.com/Content/Images/pg-prev.gif"/></a>
<a title="后一页"><img src="http://www.cnblogs.com/http://www.cnblogs.com/Content/Images/pg-next.gif"/></a>
<a title="最后页"><img src="http://www.cnblogs.com/http://www.cnblogs.com/Content/Images/pg-last.gif"/></a>
<a title="最后页"><img src="http://www.cnblogs.com/http://www.cnblogs.com/Content/Images/excel.png"/></a>
</td>
</tr></table></td></tr>
</tfoot>
</table>

这样一个类似于 GridView的分部页就实现了。以此来加载每个Action 所需的 Model。

最后的啰嗦:

这篇文章写的很笼统,旨在阐述清楚框架的基本原理。其实里面有很多巧妙的实现。由于我跟人有点强迫症,所以对代码的质量要求比较高,这个给我自己带来了很大的工作量。现在有几个问题,希望大家一起 讨论一下,更希望得到大牛的帮助:

1. 由于我的设计中Controller与Action是通过固定的LoadAction来解析的,请问有没有什么办法直接根据一个URL来用一个方法来解析,而并非是根据具体的Controller

中的Action才可以解析得到,Asp.Net MVC 中是要根据URL找到Controller中Action才会返回视图,现在是根据URL做统一的处理,所以每次不必要创建Controller与

Action。请问大牛们还有更好的实现方式不?

2. 由于使用了IO操作与反射,第一加载的时候性能会有所下降,请问还有更好的办法没有?

博客不易,转载请注明出处。Binarysoft.
 

Asp.Net MVC 自定义的MVC框架(非EF操作数据库)的更多相关文章

  1. Android—Ormlite框架简单的操作数据库

    大家在Android项目中或多或少的都会使用数据库,为了提高我们的开发效率,当然少不了数据库ORM框架了,尤其是某些数据库操作特别频繁的app:本篇博客将详细介绍ORMLite的简易用法. 下面开始介 ...

  2. Java_Web三大框架之Hibernate操作数据库(三)

    使用Hibernate操作数据库需要七个步骤: (1)读取并解析配置文件 Configuration conf = newConfiguration().configure(); (2)读取并解析映射 ...

  3. mybatis框架-SqlSession会话操作数据库的两种方式

    1.通过SqlSession实力来直接执行已经映射的sql语句 例如,查询整个用户表中的信息 在UserMapper.xml中编写sql语句 编写测试方法: 注意:这里使用的selectList方法: ...

  4. gin框架使用orm操作数据库(转)

      简介:orm俗称关系对象模型,用来映射数据库SQL和对象的工具 ,相当于mongodb里面的mongoose库,Java里面的mybatis ibatis Golang GORM使用 https: ...

  5. 开源框架GreenDao的操作

    1.为什么需要GreenDao?Google原生API不方便 @1手动组拼SQL语句 @2需要自己写操作数据库代码 @3不能把数据库中的数据映射成对象 @4没有实现关联查询 2.GreenDao是什么 ...

  6. Asp.net Core基于MVC框架实现PostgreSQL操作

    简单介绍 Asp.net Core最大的价值在于跨平台.跨平台.跨平台.重要的事情说三遍.但是目前毕竟是在开发初期,虽然推出了1.0.0 正式版,但是其实好多功能还没有完善.比方说编译时的一些文件编码 ...

  7. ASP.NET MVC 自定义路由中几个需要注意的小细节

    本文主要记录在ASP.NET MVC自定义路由时,一个需要注意的参数设置小细节. 举例来说,就是在访问 http://localhost/Home/About/arg1/arg2/arg3 这样的自定 ...

  8. Asp.net Mvc 自定义Session (二)

    在 Asp.net Mvc 自定义Session (一)中我们把数据缓存工具类写好了,今天在我们在这篇把 剩下的自定义Session写完 首先还请大家跟着我的思路一步步的来实现,既然我们要自定义Ses ...

  9. day13(JSTL和自定义标签&MVC模型&javaweb三层框架)

    day13 JSTL标签库(重点) 自定义标签(理解) MVC设计模式(重点中的重点) Java三层框架(重点中的重点) JSTL标签库   1 什么是JSTL JSTL是apache对EL表达式的扩 ...

随机推荐

  1. 基于MVC4+EasyUI的Web开发框架经验总结(12)--利用Jquery处理数据交互的几种方式

    在基于MVC4+EasyUI的Web开发框架里面,大量采用了Jquery的方法,对数据进行请求或者提交,方便页面和服务器后端进行数据的交互处理.本文主要介绍利用Jquery处理数据交互的几种方式,包括 ...

  2. 从C#到Objective-C,循序渐进学习苹果开发(7)--使用FMDB对Sqlite数据库进行操作

    本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本篇主要开始介绍基于XCod ...

  3. 关于EF的 序列化类型为“XXX”的对象时检测到循环引用。

    在用Ef的时候,也许经常会遇到循环引用的错误. 下面提供解决办法.(不是Json.Net,如果是Json.Net可以给导航属性通过增加特性标签来解决该问题) ef大多数问题,可以通过ToList()来 ...

  4. coreseek (sphinx)+ Mysql + Thinkphp搭建中文搜索引擎详解

      一, 前言    1,研究coreseek的动机 我有一个自己的笔记博客,经常在上面做一些技术文章分析.在查询一些文章的时候,以前只能将要查询的内容去mysql中用like模糊匹配.在文章多了的情 ...

  5. 一次Debug过程的思考

    前一段时间,部门接入了新业务,由于业务量小,架构非常简单,采用了最简单的LNMP架构,整个项目是交给一个刚毕业的RD负责的,这是背景. 上线前半天,服务平稳运行.下午的时候,开始收到大量报警:No h ...

  6. ReportingServies——SQLServer报表开发综合实例

    如果我们安装了sqlserver2008 R2,将会自动安装一个报表开发工具 不要以为此报表开发工具只适合于sqlserver2008,其实在sqlserver2012中也是支持的,事实上我现在项目中 ...

  7. Monkey测试3——Monkey测试结果分析

    Monkey测试结果分析 一. 初步分析方法: Monkey测试出现错误后,一般的差错步骤为以下几步: 1. 找到是monkey里面的哪个地方出错 2. 查看Monkey里面出错前的一些事件动作,并手 ...

  8. Node.js Web 开发框架大全《路由篇》

    这篇文章与大家分享优秀的 Node.js 路由(Routers)模块.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用 ...

  9. 10款免费的响应式 WordPress 主题下载

    响应式和现代设计风格的 WordPress 主题与能够非常灵活的适应所有设备.而高级主题能够更大可能性的轻松定制.所有的主题是完全响应式的,您可以从主题选项中禁用/启用响应模式.下面这个列表收集了10 ...

  10. Session Storage、Cache Storage

    Session Storage sessionStorage用于本地存储一个会话(session)的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁(浏览器关闭).因此se ...