现在的位置: 首页 > 综合 > 正文

Asp.net下的对象成员数据绑定器实现

2012年01月04日 ⁄ 综合 ⁄ 共 2831字 ⁄ 字号 评论关闭

       用过MonoRail的朋友应该知道它提供的对象成员数据绑定功能非常方便,通过标记参数属性或方法就可以自动把提交回来的数据和对象成员进行绑定;有了这些方便的功能的确可以节省大量的set代码。不过这些功能只是MonoRail提供,于是实现类似的功能方便自己开发。

实现目标:

       可以灵活方便地实现数据绑定。

       OrderSearch search = FormContext.BindObject<OrderSearch>();

     Orders order = FormContext.BindObject<Orders>("order");

制定规则和约束

       首先确定WEB提交的数据和成员属性的映射关系,可以通过名称约定的方式:

       <input id="Text1" name="companyname" type="text" />

       xxxx.LastNamexxxx_LastNamexxxxLastName等。在绑过程可以指定前缀进行对象成员的绑定;不过在webForm控件的Nameasp.net生成的,在关系分析上就相对复杂些。

       类型转换接口的定义

因为转换的情况是很难确定;除了。NET的基础类型外实际应用中还会存在其他转换方式,如:HttpPostedFilebyte[],序列化StringObject等。因此制定转换接口就可以方便实现可扩展和可配置。

    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

    }

 

IStringConverter工厂的实现

       由于转换情况的不确定性,因此通过工厂的方式来达到代码对外的封闭性和良好的扩展性。可以通过目标类型来获取相关转换实例,在.NETIDictionary就能够达到应用的要求。

        static IDictionary<Type, IStringConverter> mConverters;

        public static IDictionary<Type, IStringConverter> Converters

        {

            get

            {

                if (mConverters == null)

                {

                    lock (typeof(ConverterFactory))

                    {

                        OnInit();

                    }

                }

                return mConverters;

            }

        }

        static void OnInit()

        {

            if (mConverters != null)

                return;

            mConverters = new Dictionary<Type, IStringConverter>();

            mConverters.Add(typeof(byte), new ToByte());

         

            LoadConfig();

           

        }

        //从配置文件加载转换器映射,如果配置存在相同类型转器就取代原有转换器

        static void LoadConfig()

        {

            //Load Config

            // <converter type="System.Int32",value="HFSoft.Binder.ToByte"

        }

为了方便使用可以在工厂中硬编码配置内部基础类型;因为转换情况的不确定,所以允许通过配置文件的方式引入不同情况的类型转换器。

可以扩展性的Custom Attribute

       虽然工厂可以达到转换接口的可配置性,但实际上很难达到应用要求;在某些情况下类型转换器只是在某些对象成员中有效(虽然配置文件也可以达到期要求,但在配置文件中定义这么小的粒度并不是好的选择);通过Attribute给相关Property指定类型转换器非常适合。

   /// <summary>

    /// 用于特殊情况下描述对象具体成员的转换器

    /// </summary>

    [AttributeUsage(AttributeTargets.Property)]

    public class ConverterAttribute : Attribute, IStringConverter

    {

        public ConverterAttribute(Type convertertype)

        {

            mConverterType = convertertype;

        }

        public ConverterAttribute(Type convertertype, string defvalue)

        {

            mConverterType = convertertype;

            mDefaultValue = defvalue;

        }

        private Type mConverterType;

        public Type ConverterType

        {

            get

            {

                return mConverterType;

            }

        }

 

        private String mDefaultValue;

抱歉!评论已关闭.