ASP.NET MVC的RAD之路(一)
嗨。或许我有极重的RAD情结,当我第一次弄明白ASP.NET MVC架构之后,我忽然发现,RAD有了希望。大多数情况下,当你的Model不幸被修改了,不得不去修改View。而从Model到View的映射还不得不让人来处理,也就是设计时的处理。Visual studio 2008在我们第一次创建View的时候可以帮一点小忙,而修改根本就无能为力了。其实我的期望比较的现实,大概就是ObjectGrid的ASP.NET MVC版。
例如你的Model可以写成这样:

public sealed class Product
{
[Hidden]
public int Id { get; set; }
[TextBox(Caption = "商品名称", Width = 120)]
public string Name { get; set; }
[DropdownList(Caption = "类别", ListCreator = typeof(CategoryLister))]
public ProductCategory Category { get; set; }
[TextBox(Caption = "产地", Width = 120)]
public string ProducingArea { get; set; }
[RadioBox(Caption = "单位", ListCreator = typeof(UnitLister))]
public string Unit { get; set; }
[EditableGrid(Caption = "存货量", AllowAdd = true)]
public IEnumerable(Stock) Stocks{ get; set; }
}
[ObjectForm(ViewStyle.InRow)]
public sealed class Stock
{
[Hidden]
public Product Product { get; set; }
[TextBox(Caption = "产品规格", Width = 120)]
public string Spec { get; set; }
[TextBox(Caption = "数量", Width = 120)]
public int Quanlity { get; set; }
[TextBox(Caption = "单价", Mask = "0.##")]
public double Price { get; set; }
[DatePicker(Caption = "入库日期")]
public Date Warehousing { get; set; }
}
然后在一个View中可以这样使用:
<% Html.EditorForm(Model); %>
</div>
这时候,如果Model变了,就不用担心View了。就让Model随便去变吧!
实现这个梦想,有两个方案。第一个方案是动态View引擎。先替换掉View的查找过程,当某个ViewName对应的View不存在时,如果有相应的定义,就立即生成一个动态的View交给ViewEngine。如果可能,这个ViewEngine应该替换成能处理动态View的。这个途径纯粹是在ASP.NET MVC内部解决,但限于目前MVC本身的能力,存在一定的难度。你知道的,目前编辑页面的Get和Post是占用两个Action的,动态化以后,第二个Action被动态化了。动态化这个Action本身并不复杂,但为了处理各种复杂Model,所以工作量比较大。此外,由于编辑Form是动态生成的,与页面容器的样式协调性也比较难以处理。
第二个途径是使用ExtJS。ExtJS最大的长处就是处理动态的东西,因为一切的一切都是在页面上搞定的。服务端只负责组装,真正的运行却是在客户端。最关键的是:在解决皮肤这样的全局问题的时候,这个方案就非常便利了。但是,显然这个方案的工作量比方案一会更大。
好吧,收集一下现有的资源, 选择其中一个方法来实现。
1.已经有一整套ExtJS的扩展可以在ASP.NET MVC下直接使用。
2.已经有一个比DefaultModelBinder功能更强大的IModelBinder,可以处理更复杂的Model。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义