顯示具有 MVVM 標籤的文章。 顯示所有文章
顯示具有 MVVM 標籤的文章。 顯示所有文章

2016年3月12日 星期六

ASP.NET MVVM - 主從式網站資料的Cache服務

主從式網站資料的Cache服務
Excalibur中一直有個能夠利用Cache物件儲存網頁ViewState於後端伺服器中的功能
過去啟用需以Web.config設定Path的方式,但現在的新版本我們有了更快速方便使用的方法
只要直接在Page上加一行程式碼
[PageCacheViewState(true, false)]
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
}
當PageCacheViewState使用後網頁前端原始碼
產生到前端的網頁只有一段GUID資料,此功能Cache Timeout預設留存40分鐘(可web.config設定)
讓ASPX網頁的ViewState資料不要往返前後端在PostBack時消耗頻寬傳送,可大幅提升網頁效能速度
並且在新版本Excalibur使用Cache的方式也有項很特別的變更,就是其中附加了一隻新的Cache服務程式
只要當第一次Cache時類別庫會自動的在伺服器啟動一個Excalibur.Scabbard背景行程
此行程的功用就是專門用來儲存Cache的,它會以TCP/IP的方式和持續和網站連線,將序列化後的資料儲存於其中
為何我們需要特地為Cache這麼做呢?因為IIS的機制本身會定期回收網站行程,而且IIS網站可以設定多行程並行
原本ASP.NET提供的Cache卻只能依附在單一網站行程內,只要工作區關閉重啟Cache資料必定會消失
若是設定多行程的網站,行程之間使用的Cache也不會是同一份資料
更有可能因為線上網站是有使用負載平衡,多台主機的資料根本沒辦法跨主機行程共用
預設的情況我們不需任何設定就會為一個網站開啟一個Excalibur.Scabbard行程
若需要跨網站或主機間使用,只要於Web.config中指定IP和Port即可
<configuration>
  <configSections>
    <section name="extensions" type="CachePage.ExtensionsConfigSection"/>
  </configSections>
  <extensions>
    <cacheService>
      <netServer hostName="127.0.0.1" port="6143"></netServer>
      <!--<netClient hostName="127.0.0.1" port="6143"></netClient>-->
    </cacheService>
  </extensions>
</configuration>
很簡單的在主網站的Server用netServer設定,其他網站Client用netClient設定
然後這個Cache服務不僅僅只能用來暫存ViewState,Excalibur也提供了可以呼叫的方法

只要將原始的Cache物件使用方式改成有Item的擴充函式就可以了
ps. Excalibur.Scabbard行程關閉條件是在IIS關閉網站後,沒有任何網站與它連線的5分鐘左右自動關閉

2013年10月6日 星期日

ASP.NET MVVM - 兩個Extensions UserControl互動與相互傳值的方法

如果常在WebForm應用程式中切割一堆UserControl使用
難免會碰上互動傳值的問題,而且解法應該不少
普通情況只要頁面上有Register過ascx路徑都可以取得類別型態與Property/Event
然後也能利用FindControl和Interface來處理...等等
但若是兩個UserControl放置在千里之遙
甚至不在氣泡事件OnBubbleEvent能解決的樣版關係的情況下
可以試試以下設計的方法






SendMessage方法傳送的第一個參數即MessageNotify事件EventArgs的CommandName
第二個參數即事件EventArgs的CommandArgument
MessageNotify中的sender則是發送訊息的UserControl物件

這裡呼叫SendMessage會對Page內所有Extensions UserControl註冊的MessageNotify事件進行觸發
但是不會觸發發送訊息的UserControl自己本身註冊的MessageNotify事件
所以也能在MessageNotify事件時呼叫SendMessage傳送其他訊息出去

 (MVVM 1.1.1.8版本以上加入)

後記:在更新版本中加入了Attribute的使用方法,示例中的UserControl2可改寫成這樣

相當於直接標註方法為可讓其他控制項以SendMessage公開呼叫的意思
呼叫的Command為指定的方法名稱,Argument為參數

2013年9月25日 星期三

ASP.NET MVVM - ExtensionsControl (2)

這次MVVM更新到1.1.1.5版了,那這裡要介紹的新控制項是RouteManager跟HolderSource
顧名思義第一個控制項八成是用來搞Url的Route用的
第二個也一定和PlaceHolder用來動態載入控制項的功能有關

首先要使用RouteManager因為要用到ASP.NET 4.0才加入的Route功能,需要在Global.asax中設定
假設網站首頁的路徑是"~/Default.aspx"那麼Application_Start中就加入以下程式


前兩行是排除不需改變Route規則的Url,然後只要將"~/Default.aspx"
傳入RouteManager的Configure方法即可
接著就新增首頁的Default.aspx檔案

在Default.aspx的頁面中加入RouteManager與HolderSource控制項
其中HolderSource可同時放入多個並且可以在部分HolderSource的HolderTemplate樣板中
能再放入一層的單個RouteManager加多個HolderSource的組合,之後數層的規則一樣
例如就像下面這樣具有到第三層的樹狀排列結構


這樣就完成可以執行測試了

RouteManager中只有一個DefaultLoadName屬性可以用來選擇RouteValue
不符時預設顯示的HolderSource的ID
然後HolderSource的ID則就是被用來與Url之中當RouteValue比對
HolderSourceID與RouteValue相符就會顯示HolderTemplate的內容
比如說瀏覽器網址是"http://localhost:25179/Index/"
在上面的例子就會呈現Index這個HolderSource的樣板內容
若網址導到是"http://localhost:25179/Home/"
Index的樣板就不會呈現而改成呈現Home的樣版內容
如果網址後面多加一個目錄變成"http://localhost:25179/Home/Page1/"
那麼除了呈現Home的樣版內容外還會讓Home中Page1的樣版內容也一起呈現出來
依此類推,這樣我們就可以利用Route控制網頁中控制項的呈現





HolderSource也有個IsLoad屬性預設值是false用來控制樣版呈現,當樣版內容不呈現時
不管裡面被放什麼控制項都不會被載入跟進入生命周期事件那麻煩的ViewState也就不會產生了
RouteManager的工作就只是用Route物件比對Url,先算出自己在哪一層
再找出應該要用來呈現的HolderSource將IsLoad變成true而已
而且因為樣板裡面也能夠放入UserControl那些
所以也可以視情況在UserControl中選擇再放入RouteManager與HolderSource進去
只要總共不要超過10個的RouteValue就應該沒有問題了吧

2013年8月27日 星期二

ASP.NET MVVM - ExtensionsControl (1)

這兩天在ASP.NET MVVM Excalibur中加入了幾個使用者控制項
我一直在想有無好一點的方法去處理ViewModel對陣列集合資料的繫結功能
結果還是先把平日自己開發來經常使用在集合資料的控制項加進去了
以下是對這幾個控制項的介紹與示例程式

首先是FreeDataSource跟Pagination的功能

1.FreeDataSource是一個資料來源控制項如同SqlDataSource,ObjectDataSource,EntityDataSource等一樣 用來搭配ListView,GridView,DataList..等等控制項呈現資料
其特性是沒有其他限制,讓我們可以直接使用事件的回傳值當作資料來源
無論在方法中回傳什麼也都盡可能讓它能支援分頁排序等功能
例如下面的方法:
就能直接讓回傳的IEnumerable物件資料用做DataBind的資料這樣

2.Pagination是分頁用的控制項搭配FreeDataSource與DataPager製作分頁功能
使用時需要在Pagination上指定PagerControlID以及在FreeDataSource上將PaginationControlID
設定為該Pagination的ID


執行結果:

順利完成分頁
(其實還可以在FreeDataSource的方法中透過取得的頁數進行分頁處理)

這裡主要是想當我們使用MVVM時可以讓ViewModel使用Binding去繫結FreeDataSource的OnExecuteSelected事件,然後就能將資料DataBind到要顯示資料的ListView或GridView上面,
以達到控制Model資料的權責歸於ViewModel,與View的呈現邏輯分離

另外還有加入PluralHolder, ContainerButton, HolderSource三個控制項
是有關於控制動態樣板的功能,在編輯多筆資料時也許有用
與示範程式一併都放在1.1.1.3版以後的專案範本中

2013年1月22日 星期二

ASP.NET MVVM - ValueConverter


最近MVVM新增的功能是關於Binding屬性(Property)間物件型別轉換的處理
過去我們只是利用IConvertible介面在背後做簡易的轉換
這在Web上沒有太大的問題,資料大多都為字串也就一直都沒處理例外
只是最好的方式還是ViewModel與View上控制項屬性使用完全相同的屬性型別
不過今天新增了一個抽像類別ValueConverterBase
可以在當我們開發ViewModel時選擇為屬性(Property)添加Attribute
指定特定的ValueConverter轉換類別去處理型別轉換問題
(當然沒有指定Attribute的屬性我們還是有利用IConvertible處理預設型別轉換)

以下是一個轉換屬性型別的範例
當介面上TextBox輸入一個字元時,Binding到ViewModel可以轉成該字元ASCII號碼的int型態





ASCIINumberValueConverter實做了ValueConverterBase中的兩個函式

Convert(object value, out bool done)
將傳入的value轉換成ViewModel所要的屬性型別(PropertyType),out done指出是否成功轉換

ConvertBack(object value, Type targetType, out bool done)
將傳入的value轉換回View上控制項原本的屬性型別(targetType),out done指出是否成功轉換


在屬性上設定ValueConverterAttribute由ASCIINumberValueConverter
來處理Word這個屬性的型別轉換

(附帶一提,ViewStateProperty是讓這屬性存放到ViewState中,65是預設值)

2012年2月28日 星期二

ASP.NET MVVM(3)

往往我們系統不做分層架構的原因只是因為存在著某些單純的困難而已
因此現在的系統開發開始會利用越來越受人重視的像是ORM..等等的技術
所以現在MVVM也可以來個相似的Mapping功能囉^^

就來寫個示範,我們也沿用第一篇文章的範例
讓網頁上有一個文字方塊與按鈕,可以輸入名子按下按鈕後在文字方塊下方,顯示輸入的名子

1.建立View的Default3.aspx檔案,內容如下

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>MVVM By Auto ViewModel Base</title>
</head>
<body>
<form id="form1" runat="server">
<div>
請輸入您的大名:<asp:TextBox ID="TextBox1" runat="server" Text="<%$ Binding: Name %>"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="確定" OnClick="<%$ Binding: Button1_Click %>" /><br />
<br />
<asp:Label ID="Label1" runat="server" Text="<%$ Binding: Text %>"></asp:Label>
</div>
</form>
</body>
</html>



2.完成View後,就按下Visual Studio的建置方案(F6)對網站進行一次編譯,等建置成功,然後在方案總管中
用滑鼠對方案目錄進行->滑鼠右鍵->重新整理資料夾



我們馬上立即就能夠發現在App_Code中多了一些目錄與類別檔案,像此次的ViewModel/Base/Default3.cs
這個就是MVVM針對Default3自動產生的ViewModel基底類別,
類別裡面已經實做了在View中所有被Binding使用到的所有屬性與EventMethod,只等我們繼承引用而已
(這些class是不需要改它的,每次View有變動後就會重新產生一次)

3.製作ViewModel,在方案總管加入新項目Hello3.ascx至網站中,撰寫Hello3.ascx.cs的內容
將原本繼承的UserControl改為新的基底類別ViewModel.Base.Default3
接著使用override關鍵字帶出Button1_Click方法並撰寫其功能程式,如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class ViewModel_Hello3 : ViewModel.Base.Default3
{
protected void Page_Load(object sender, EventArgs e)
{

}
public override void Button1_Click(object sender, EventArgs e)
{
if (Name != "")
{
Text = Name + ",您好。";
}
else
{
Text = "請輸入名字";
}
base.Button1_Click(sender, e);
}
}


4.將ViewModel放進View中,如下,這樣就完成囉。

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %>

<%@ Register Src="ViewModel/Hello3.ascx" TagName="Hello3" TagPrefix="uc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>MVVM By Auto ViewModel Base</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<uc1:Hello3 ID="ViewModel" runat="server" />
請輸入您的大名:<asp:TextBox ID="TextBox1" runat="server" Text="<%$ Binding: Name %>"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="確定" OnClick="<%$ Binding: Button1_Click %>" /><br />
<br />
<asp:Label ID="Label1" runat="server" Text="<%$ Binding: Text %>"></asp:Label>
</div>
</form>
</body>
</html>


另外一提,不知道有寫過Android App的人有沒有覺得這樣就很像R.java了呢,只不過不是靜態XD

詳細範例與程式碼下載連結於公告文章(Download)

2012年2月26日 星期日

ASP.NET MVVM(2)

微軟在XAML上的Binding與ViewModel的概念真的非常特別
雖然ASP.NET是網站型態會受限於程式需要PostBack的方式才能執行
但Web Form的控制項必然與他有一定的共通點...畢竟我們有很多案件的開發需求還是在Web上進行
所以我們就繼續的借用一些新的東西來用吧XD哈哈

Expression語法新增加的功能是ID與Type 的指定,以及Property對Method的繫結

(1)語法上加入逗號將繫結屬性名稱外可再選擇性的在加上ID或Type等於某控制項的方式,這樣以後此控制項Binding時就不會去以原本的ViewModel為對象而是用ID或型別去尋找出該條件的對象做繫結,而且這個尋找方式有向上延伸的功能,也就是往上控制項階層進行尋找
例如用在UserControl中也就可以因為設定了Panel的Type而讓UserControl因放置的Panel不同而有不同結果

(2)原本的繫結名稱可以用繫結對象Method的名子來做設定,只要繫結對象(ViewModel)有公用符合名稱並且有回傳值無參數的方法即可

(3)語法上可以使用Mode等於去設定繫結方式
Default:預設值,會自行判斷如果使用ViewModel則用雙向,若是指定控制項ID或Type則預設為單向
OneWay:單向,只會在目標屬性設定繫結對象的屬性值,不會改變繫結對象屬性值
TwoWay:雙向,目標屬性改變時也會同時更變繫結對象屬性

以下是程式示範

1.Default3.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %>

<%@ Register Src="UserControl.ascx" TagName="UserControl" TagPrefix="uc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Bind Control & Method</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <uc1:UserControl ID="UserControl1" runat="server" />
        <asp:Label ID="Label1" runat="server" Text='<%$ Binding : ID = UserControl1, GetText %>'></asp:Label>
        <asp:Panel ID="Panel1" runat="server" ToolTip="456">
            <asp:Label ID="Label2" runat="server" Text='<%$ Binding : Type = Panel, ToolTip %>'></asp:Label>
        </asp:Panel>
        <asp:TextBox ID="TextBox1" runat="server" AutoPostBack="true" Text="789"></asp:TextBox>
        <asp:Label ID="Label3" runat="server" Text='<%$ Binding : ID = TextBox1, Mode = OneWay , Text %>'></asp:Label>
        <%-- Mode => Default, OneWay, TwoWay --%>
    </div>
    </form>
</body>
</html>


2.UserControl.ascx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class UserControl : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    public string GetText()
    {
        return "123";
    }
}

2012年1月23日 星期一

ASP.NET MVVM(1)

MVVM是Model-View-ViewModel的縮寫
基本上也是一種程式系統分層的架構:
Model負責資料。
View負責呈現介面。
ViewModel則是前兩者間互動的媒介。
介面不能直接驅動資料,必須由ViewModel負責
詳細相關介紹可以閱讀這篇文章
http://blog.sanc.idv.tw/2011/12/wpf-mvvm.html

在ASP.NET MVVM裡面Excalibur將透過利用ASP.NET的Expression語法讓Web Form同樣做出類似WPF MVVM的架構,先來一個示範,請看看囉

1.首先網站的web.config要加進Excalibur的設定,註冊好'Binding'這個Expression語法需交由Excalibur的類別處理,(當然Bin裡面dll等等,那些也要放進去)



然後我們做一個示範功能好了,只要一個網頁上有一個文字方塊與按鈕,可以輸入名子按下按鈕後在文字方塊下方,顯示輸入的名子即可,像下面這樣



2.在方案總管加入新項目Default.aspx至網站中,然後於設計的原始檔中加入各一個TextBox、Button、Label,調整並加入Binding語法如下



這樣就幾乎完成MVVM其中的View了,要改變做法的是使用Binding,Binding裡面的文字意思就是View要繫結到ViewModel中的屬性名稱,而且這邊就連像OnClick這樣的event也可以透過Binding去繫結ViewModel裡面的method了,所以,至於Default.aspx.cs中的程式就一行都不需要去動它了,因為View不做其他事情

3.接下來要製作ViewModel的部分,在方案總管加入新項目Hello.ascx至網站中,因為示範的功能很小Model的部分就先用一個Label控制項來充當省略囉,Hello.ascx設計如下



4.撰寫Hello.ascx.cs的內容,分別完成Name屬性與Button1_Click方法中的程式,如下



到這裡一定要說明Hello.ascx的兩個地方:

(1)為何Label的ID屬性要設為'Model'?

答:是因為要有簡單的方式當做MVVM架構中Model物件的識別,或者如果有其他需求也有另一個方法可以在程式中實做IViewModel介面,指派其他或者不是控制項的物件做為Model。所以另外同樣的在View中也是用相同的規則,會用ID為ViewModel的控制項或實做IView介面,後指派的結果讓MVVM架構識別ViewModel物件

(2)為何View裡面Binding的Text屬性不用實做出來?

答:這是因為使用了幫ViewModel節省程式碼的機制,屬性名稱相同ViewModel就不用另外去寫轉譯Model的屬性到ViewModel上的程式,因為在View上Binding的規則是,如果ViewModel沒有這個屬性就允許透過去Binding裡面Model的屬性,因此只要屬性不是Binding在雙向的目標上,只是要唯讀呈現就可使用,否則不建議喔

5.最後終於要將ViewModel跟View結合起來了,到Default.aspx的設計頁面將Hello.ascx自方案總管拖曳進來,然後修改控制項ID為ViewModel,如下,建置成功,就完成囉



Default.aspx.cs



詳細範例與程式碼下載連結於公告文章中

2011年5月16日 星期一

ASP.NET MVVM Excalibur 1.1 - Release

Excalibur.Web 1.1.9.3

下載處(Download) - 2020/10/18

2020/10/18 : 擴充控制項新增DataBound事件,修正Binding屬性值於事件DataBind控制項後復原問題
2019/06/15 : 修正Excalibur.Scabbard在未設定Port時因TimeWait佔用過多尋找不到FreePort的錯誤
2019/02/23 : 新增IView擴充方法ReBindingViewEvents,可用於IView變更ViewModel時重新繫結事件
2018/12/02 : 新增ScabbardSessionStateStore類別,可於config設定Session以共用快取Cache存放
2018/07/04 : 修正FreeDataSource控制項在使用DataView資料來源做排序含Null值時產生的錯誤
2018/06/25 : 修正Binding語法使用在具有多個postDataKey的控制項時發生的錯誤ex:CheckBoxList
2018/05/08 : Extensions.Web.UI.UserControl新增SortExpression屬性與Sort方法,提供排序使用
2018/04/29 : 修改PluralHolder於ExtractAllValues型別不符時帶出Null值而不產生例外
2018/01/06 : 新增VirtualPathAttribute類別,可尋找並取得UserControl虛擬路徑的類別Attribute
2017/06/18 : 改進ViewStatePropertyAttribute處理效能及DefaultValue屬性Page使用問題
2017/02/26 : 增加ComponentOperator類別的方法,可支援非public型別使用
2016/09/24 : 新增Extensions.Web.Serialization.ObjectStateFormatter序列化型別
2016/07/30 : 修改Binding機制,使PostBack時Load於稍後的RaiseChangedEvents讀取更新資料
2016/05/14 : CacheExtensions.GetProvider加入連線參數,以AppDomainAssemblyBinder加強反序列化
2016/04/01 : 修正ViewStatePropertyAttribute的DefaultValue屬性在非擴充UserControl使用的問題
2016/03/18 : 繫結Binding增加可使用!Expression驚嘆號取得相反布林值語法功能
2016/03/12 : 修正Excalibur.Scabbard.exe在VS網站開發伺服器不會隱藏及強制關閉後無法重開的問題
2016/02/13 : 加入自動啟動的Excalibur.Scabbard.exe服務,管理網站共用快取Cache資源
2015/07/02 : PluralHolder控制項可使用DataSourceID綁定資料來源控制項,並新增ExtractAllValues方法
2015/07/02 : 修改Binding以支援繫結控制項的IStateManager子物件Property(控制項在樣板內未支援)
2015/04/13 : 對Page,MasterPage,UserControl增加擴充方法SendMessage,GetControlMessageCenter
2015/04/11 : 置換ViewStatePropertyAttribute命名空間並使其支援於Page,MasterPage中使用
2015/03/10 : 修正FreeDataSource查詢事件以yield return產生重複執行錯誤並支援DataView資料來源
2015/03/10 : 修正Binding繫結在部分動態載入控制項的情況AutoPostBack無法觸發事件問題
2015/03/07 : 修改ExtensionsConfigSection設定類別,增加PageAdapter.SetEnableCachePageViewState
2015/03/07 : 支援.net3.5的版本,除了3.5不相容功能以外,例如Route,dynamic等
2014/10/03 : 加入CommandProvider類別與Raise及Send方法,用於預先定義通知事件的方法指令型別
2014/08/12 : 擴充控制項中加入BubbleEventMethodAttribute與RaiseBubbleEvent方法簡化氣泡事件使用
2014/08/12 : 增加ContainerButton的Container選項,HtmlGeneric可搭配TagName屬性指定其他Html容器
2014/04/02 : 修改GuidCachePageStatePersister類別合併減少ViewState使用的Cache數量
2014/03/08 : 修改事件繫結時的處理方法,使支援具有部分提供參數相等的方法(參數名稱與類別)
2014/02/28 : 新增IViewBindingsAccessor介面並使Binding繫結支援ExpandoObject等dynamic物件
2013/12/20 : 當Binding繫結在ViewModel,Model中找不到屬性或未加入ViewModel則直接繫結View屬性
2013/12/20 : 新增UpdatePanelAutoBindingAttribute屬性類別可控制關閉UpdatePanel更新
2013/11/27 : 使ReloadToManagedRoute方法加入傳遞物件資料至ViewModel功能
2013/11/22 : 在UpdatePanelAdapter中加入OnUnload例外問題處理
2013/11/05 : 修改HolderSource的AppendUpdatePanel屬性部分問題
2013/10/22 : 加入ReloadToManagedRoute方法使RouteManager可以不需重導Url並更新頁面
2013/10/21 : 修正因為控制項放置順序導致OneWay繫結屬性不正確的問題
2013/10/13 : 新增MessageNotifyMethodAttribute,簡化MessageNotify使用
2013/10/10 : 增加Message的DataBoundControlHelper並加入MessageArgument的屬性繫結支援
2013/10/06 : 擴充使用者控制項新增SendMessage方法與MessageNotify接收訊息事件
2013/09/25 : 加入RouteManager擴充控制項與示範程式
2013/08/27 : 加入ExtensionsControl的5個擴充使用者控制項與示範程式
2013/07/27 : BindingExpressionEditor設計UI屬性加入下拉選單功能
2013/07/17 : 增進Property的Binding Expression效率,修改Reflection相關方法
2013/06/23 : 序列化物件比較由XmlSerializer改為BinaryFormatter支援
2013/06/22 : 在擴充UserControl中新增dynamic型態的ViewBag屬性,等同使用ViewState
2013/06/16 : 對預設的ValueConverter增加處理Nullable型別的能力
2013/06/13 : 修正對Nullable屬性無法使用繫結的錯誤
2013/05/31 : 對預設的ValueConverter增加處理Enum型別的能力
2013/05/07 : 新增BubbleEventExtensions控制項氣泡事件相關擴充函式
2013/04/04 : 修正對ViewModel屬性為序列化參考物件的型別時能夠更正確的支援
2013/03/27 : Binding繫結可用於runat="server"控制項的data-xxx等任何Html屬性了
2013/03/27 : 繫結語法加入Argument設定給予ViewModelMaker使用
2013/03/20 : 修改新增ViewModelMaker相關類別,修正編譯錯誤
2013/03/05 : 修正對自訂控制項的泛型屬性無法使用繫結的錯誤(1.1發佈)
2013/03/02 : 新增IValueConverter介面,增加ValueConverterAttribute參數給予ValueConverter建構式
2013/03/01 : 使TwoWay Binding的控制項屬性不再限定只繫結前端PostBack值,可適用後端事件變更值
2013/02/23 : 新增IFindControlProvider介面,可以在控制項中調整DataBoundControlHelper的部分過程
2013/02/23 : Binding Expression增加Life=Load,PreRender選項讓繫結可選擇提前發生
2013/01/20 : 新增ValueConverterBase與ValueConverterAttribute類別,建立轉型處理
2013/01/17 : 刪除App_Browsers資料夾必要,改由DLL自動註冊ControlAdapter
2013/01/07 : Extensions.Web.UI.UserControl新加IsPostBack以判斷控制項是否不是第一次載入
2012/12/29 : 修改disabledViewModelMaker預設值為true不開啟,新增ViewStatePropertyAttribute
2012/09/16 : 強化Binding語法可對子屬性繫結(ex:Binding List.Count)
2012/07/04 : web.config增加disabledViewModelMaker設定可選擇關閉ViewModelMaker功能
2012/04/21 : 解決IPostBackDataHandler控制項於控制項樣板中繫結問題
2012/04/17 : 修正UserControl繫結發生物件不符合目標型別錯誤
2012/04/05 : 加入IServiceProvider的屬性繫結支援
2012/03/23 : 修改設計類別與完成Excalibur.Package的VS外掛以便設計控制項的Expression
2012/03/15 : 加入BindingExpressionEditor設計類別
2012/03/13 : 新增BehaviorControl與EventTriggerControl基底類別
2012/03/09 : Binding去除屬性繫結需IAttributeAccessor控制項限制(僅剩事件繫結)
2012/03/08 : ViewModel的NamingContainer區隔在MasterPage下問題修正
2012/03/02 : Expression可設定Mode=Default,OneWay,TwoWay的不同方式
2012/03/01 : 修正判斷AsyncPostBackTrigger需符合EventHandler
2012/02/28 : 加入ViewModelMaker功能機制當每次建置網站時將自動產生ViewModel的基底類別
2012/02/26 : 繫結Property支援IConvertible轉型
2012/02/25 : BindingExpression可設定Control的ID或父層特定Type,以及支援屬性繫結到Method
2012/02/12 : ViewModel修改考慮NamingContainer區隔,繫結屬性可唯獨或唯寫
2012/01/30 : Binding加入自動使UpdatePanel加入AsyncPostBackTrigger判斷
2012/01/24 : (pm22)修正Binding於UserControl下xml編譯錯誤
2012/01/24 : ASP.NET MVVM 發佈(BindingExpressionBuilder)
2011/12/05 : 增加DescriptorDataItemContainer類別
2011/07/17 : 增加ComponentOperator取代Reflection(.NET4.0版本,3.5以下無法使用)
2011/06/22 : 修正swc組件Bug(Component)Release-1.0.3.1
2011/06/17 : 增加Flash.Web.UI.UserControl的Event(Create)
2011/05/31 : 修改swc組件初始方法
2011/05/16 : 1.0發佈