嗨。或許我有極重的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 { get; set; }
[TextBox(Caption = "商品名稱", Width = 120)]
public string Name { get; set; }
public string Name { get; set; }
[DropdownList(Caption = "類別", ListCreator = typeof(CategoryLister))]
public ProductCategory Category { get; set; }
public ProductCategory Category { get; set; }
[TextBox(Caption = "產地", Width = 120)]
public string ProducingArea { get; set; }
public string ProducingArea { get; set; }
[RadioBox(Caption = "單位", ListCreator = typeof(UnitLister))]
public string Unit { get; set; }
public string Unit { get; set; }
[EditableGrid(Caption = "存貨量", AllowAdd = true)]
public IEnumerable(Stock) Stocks{ get; set; }
}
public IEnumerable(Stock) Stocks{ get; set; }
}
[ObjectForm(ViewStyle.InRow)]
public sealed class Stock
{
[Hidden]
public Product Product { get; set; }
public sealed class Stock
{
[Hidden]
public Product Product { get; set; }
[TextBox(Caption = "產品規格", Width = 120)]
public string Spec { get; set; }
public string Spec { get; set; }
[TextBox(Caption = "數量", Width = 120)]
public int Quanlity { get; set; }
public int Quanlity { get; set; }
[TextBox(Caption = "單價", Mask = "0.##")]
public double Price { get; set; }
public double Price { get; set; }
[DatePicker(Caption = "入庫日期")]
public Date Warehousing { get; set; }
}
然後在一個View中可以這樣使用:
public Date Warehousing { get; set; }
}
然後在一個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。