用過MonoRail的朋友應該知道它提供的對象成員數據綁定功能非常方便,通過標記參數屬性或方法就可以自動把提交回來的數據和對象成員進行綁定;有了這些方便的功能的確可以節省大量的set代碼。不過這些功能只是MonoRail提供,於是實現類似的功能方便自己開發。
實現目標:
可以靈活方便地實現數據綁定。
OrderSearch search = FormContext.BindObject<OrderSearch>();
Orders order = FormContext.BindObject<Orders>("order");
制定規則和約束
首先確定WEB提交的數據和成員屬性的映射關系,可以通過名稱約定的方式:
<input id="Text1" name="companyname" type="text" />
xxxx.LastName、xxxx_LastName或xxxxLastName等。在綁過程可以指定前綴進行對象成員的綁定;不過在webForm控件的Name是asp.net生成的,在關系分析上就相對復雜些。
類型轉換接口的定義
因為轉換的情況是很難確定;除了。NET的基礎類型外實際應用中還會存在其他轉換方式,如:HttpPostedFile到byte[],序列化String到Object等。因此制定轉換接口就可以方便實現可擴展和可配置。
public interface IStringConverter
{
object ConvertTo(string value, out bool succeeded);
}
由於Web提供的數據大部份是以string的方式提供,因此定義一個基於string轉換描述。基於接口的實也很簡單:
public class ToSbyte :IStringConverter
{
#region IStringConverter 成員
object IStringConverter.ConvertTo(string value, out bool succeeded)
{
sbyte nvalue;
succeeded = sbyte.TryParse(value, out nvalue);
return nvalue;
}
#endregion
}