Magicodes.NET框架之路——让代码再飞一会(ASP.NET Scaffolding)

简介: 首先感谢大家对Magicodes.NET框架的支持。就如我上篇所说,框架成熟可能至少还需要一年,毕竟个人力量实在有限。希望有兴趣的小伙伴能够加入我们并且给予贡献。同时有问题的小伙伴请不要在群里询问问题,QQ群仅限于技术交流。

首先感谢大家对Magicodes.NET框架的支持。就如我上篇所说,框架成熟可能至少还需要一年,毕竟个人力量实在有限。希望有兴趣的小伙伴能够加入我们并且给予贡献。同时有问题的小伙伴请不要在群里询问问题,QQ群仅限于技术交流。

所有有关Magicodes.NET的问题,请在此https://github.com/magicodes/Magicodes.NET/issues页面根据类型提交相应Issues。在使用Magicodes.NET之前,请先查看官方文档并且阅读FAQ(点此阅读)

上篇提到了T4代码生成,随着生成的深入,我愈发觉得这种生成模式存在问题:

  1. 太过依赖前端脚本(增删改查都在同一个页面处理,后台控制器只是返回View)
  2. 不便于更换页面主题(前端太重)
  3. View对服务器端代码支持不够好(因为基本上都是依赖前端JS绑定的)。
  4. 不便于扩展或者扩展起来比较麻烦。比如新增和编辑时,下拉框的绑定,复选框组的绑定(当然这些都有解决办法),都需要编写大量通用的脚本。随着数据模型的复杂,这种方式维护会越来越麻烦。

基于以上原因,本人决定放弃此模式,开始新的T4模板生成研究之旅。

很多时候,只有重新再来,才能站得更高。所以我说框架成熟可能至少还得一年,因为我还在不断的尝试和学习。也希望小伙伴们能够多多支持,大牛们能够多多指导。

在研究的时候,我将目光定格到了ASP.NET Scaffolding上……

ASP.NET Scaffolding Template(ASP.NET基架模板)

ASP.NET Scaffolding。可能很多小伙伴们没听说过,但是其实你已经在用它呢。这玩意儿是微软的一个工程师编写的,然后集成到了VS2013中。这是个什么玩意儿呢?看看下面的图你可能就想起来了。

添加控制器的时候:

image

然后选择模型类,DbContext等:

image

 

点击添加后,你就会发现他干了很多碉堡了的事:

image

控制器和增删改查都生成好了!!!

我们来看看生成的控制器代码:

image

增删改查一应俱全,而且还考虑到了安全性。同样的,相关视图也生成好了,能够展示简单的列表以及增删改。

具体请看:http://www.asp.net/visual-studio/overview/2013/aspnet-scaffolding-overview

我们来看看生成的原始界面:

image

image

虽然灰不溜秋,但是不失为一种很强大的方式。好像瞬间把代码生成拉高了几个档次,个人觉得这种方式相当不错。给我的第一感觉是,妈的,好高大上啊,老子要自定义。

自定义ASP.NET MVC基架

关于ASP.NET MVC基架的资料国内还比较欠缺,FQ研究了一会,也有一点成效:

image

image

image

是不是瞬间又高大上了很多?人靠衣裳啊,别介意,这个还不够美。只是粗浅的。想想,如果能够根据控件类型生成相应JS控件,再加点逻辑控制,那就完美了!!

废话不说,我们先来看看怎么自定义这玩意儿。

第一步,安装SideWaffle:

image

可以在这个网址下载:http://sidewaffle.com/

第二步,选择ASP.NET基架T4文件:

image

然后,你就会发现项目工程里多了一个CodeTemplates目录,里面有很多T4文件:

image

这就是MVC基架T4模板(包括WebAPI等等),然后我们就可以Happy的定制了,只是目前是:

比如编辑模板,我们可以加点样式点缀点缀:

image

于是就成了上面的样子。

刚Happy不久,然后发现问题来了!!!

ASP.NET MVC基架模板的问题

 

比如在List.cs.t4模板里,我需要获取模型类的类特性,方便干点坏事。比如获取列表标题啊等等,然后我发现我杯具了。先来看看模板参数(在文件Imports.include.t4中):
<#@ parameter type="System.String" name="ViewDataTypeName" #>
<#@ parameter type="System.String" name="ViewDataTypeShortName" #>
<#@ parameter type="System.Boolean" name="IsPartialView" #>
<#@ parameter type="System.Boolean" name="IsLayoutPageSelected" #>
<#@ parameter type="System.Boolean" name="ReferenceScriptLibraries" #>
<#@ parameter type="System.Boolean" name="IsBundleConfigPresent" #>
<#@ parameter type="System.String" name="ViewName" #>
<#@ parameter type="System.String" name="LayoutPageFile" #>
<#@ parameter type="System.String" name="JQueryVersion" #>
<#@ parameter type="Microsoft.AspNet.Scaffolding.Core.Metadata.ModelMetadata" name="ModelMetadata" #>

从参数不难看出,我们能够用的就是这些了。默哀一会。然后我们发现微软那哥们给我们打开了一扇窗子,自己却被门夹了脑袋。我们唯一可以寄托希望的参数在类型:Microsoft.AspNet.Scaffolding.Core.Metadata.ModelMetadata

咦,这玩意儿咋这么眼熟,咋一看跟MVC的ModelMetadata还有EF的ModelMetadata有点像。但其实差的有点远。

image

https://msdn.microsoft.com/en-us/library/microsoft.aspnet.scaffolding.core.metadata.modelmetadata(v=vs.118).aspx

就给我这么点东西,模型类型都拿不到,你让我咋玩!!!同样的属性也是拿不到类型的,妈蛋,让我白高兴了一把。微软那哥们,哥知道参数T4模板不好写,参数传过来还经过了序列化,不大好传递类型,不然反序列化会有问题,但是你丫的也想想办法呀,都是你家东西,你就搭了一个宏伟的架子,然后就没了,让哥情何以堪!!果然只是基架。为此,哥还在stackoverflow上用蹩脚的英语提了一个问题:

http://stackoverflow.com/questions/28063731/how-to-get-model-type-in-microsoft-aspnet-scaffolding-list-cs-t4

这是博客园的飞机票:http://q.cnblogs.com/q/69370/

好吧,为了便于T4模板参数传递,微软那哥们是将ViewModel的属性处理好然后通过参数传递过来的,T4模板参数用到了序列化和反序列化,如果传递模型类型,就得把相关dll丢GAC里面,于是就成现在这样了。自然,理论上应该是无解,于是无奈放弃。

 

尾声

看来伟大的想法行不通啊,看来还是自己老老实实重新写过吧。目前控制器这块的T4生成已经重构了,准备开始重新编写View的T4模板了。开启全新模式,我将在下篇介绍新的T4模板生成。

╮(╯▽╰)╭,蛋疼。

目录
相关文章
|
1月前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
3月前
|
开发框架 JavaScript 前端开发
5个.NET开源且强大的快速开发框架(帮助你提高生产效率)
5个.NET开源且强大的快速开发框架(帮助你提高生产效率)
111 4
|
4月前
|
开发框架 前端开发 JavaScript
盘点72个ASP.NET Core源码Net爱好者不容错过
盘点72个ASP.NET Core源码Net爱好者不容错过
75 0
|
4月前
|
开发框架 .NET
ASP.NET Core NET7 增加session的方法
ASP.NET Core NET7 增加session的方法
38 0
|
7天前
|
人工智能 自然语言处理 算法
分享几个.NET开源的AI和LLM相关项目框架
分享几个.NET开源的AI和LLM相关项目框架
|
2月前
|
开发框架 网络协议 .NET
深入.net框架
深入.net框架
12 0
|
2月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
32 0
|
2月前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
78 0
|
2月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
109 5
|
3月前
|
算法 BI API
C#/.NET/.NET Core优秀项目和框架2024年1月简报
C#/.NET/.NET Core优秀项目和框架2024年1月简报

相关实验场景

更多