ASP.NET MVC的RAD之路(一)

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

例如你的Model可以写成这样:

代码
[ObjectForm(ViewStyle.Table)]
public sealed class Product
{
  [Hidden]
  
public int Id { getset; }

  [TextBox(Caption 
= "商品名称", Width = 120)]
  
public string Name { getset; }

  [DropdownList(Caption 
= "类别", ListCreator = typeof(CategoryLister))]
  
public ProductCategory Category { getset; }

  [TextBox(Caption 
= "产地", Width = 120)]
  
public string ProducingArea { getset; }

  [RadioBox(Caption 
= "单位", ListCreator = typeof(UnitLister))]
  
public string Unit { getset; }

  [EditableGrid(Caption 
= "存货量", AllowAdd = true)]
  
public IEnumerable(Stock) Stocks{ getset; }
}

[ObjectForm(ViewStyle.InRow)]
public sealed class Stock
{
  [Hidden]
  
public Product Product { getset; }

  [TextBox(Caption 
= "产品规格", Width = 120)]
  
public string Spec { getset; }

  [TextBox(Caption 
= "数量", Width = 120)]
  
public int Quanlity { getset; }

  [TextBox(Caption 
= "单价", Mask = "0.##")]
  
public double Price { getset; }

  [DatePicker(Caption 
= "入库日期")]
  
public Date Warehousing { getset; }
}

然后在一个View中可以这样使用:

<div name="content">
  
<% 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。

posted @ 2009-12-10 12:07 双鱼座 阅读(...) 评论(...) 编辑 收藏