扩展数据绑定到IList的功能

         NClay提供了丰富的数据绑定到对象上的功能,大大降低了开发人员通过Request.Params[xxx]获取值所带来的烦恼;但一直以来都没有实现对象列表的绑定功能,由于这场景使用情况还是比较多于是在NClay的基础上扩展出IList<T>数据绑定功能,开发人员简单地描述一下属性就能把提交的数据绑定到IList<T>中;同时你也能体验到NClay在数据绑定到对象上的扩展是非常灵活的。

场景:


框架很方便就能把以上场所提交的数据绑定到一个
IList<T>的成员对象中。

定义描述:

    [NClay.MVC.Action("~/Default.aspx", typeof(IImportUsers))]

    public class Default:IImportUsers

    {

        #region IImportUsers 成员

        private IList<User> mUsers;

        [NClay.MVC.Binder.Converter(typeof(UsersBind))]

        public IList<User> Users

        {

            get

            {

                return mUsers;

            }

            set

            {

                mUsers = value;

            }

        }

        #endregion

}

    public class UsersBind : IListConverter<User>

    {

        protected override string Prefix

        {

            get

            {

                return "user";

            }

        }

    }

扩展代码:

       public abstract class IListConverter<T> : NClay.MVC.Binder.IStringConverter where T : new()

    {

        #region IStringConverter 成员

        protected abstract string Prefix

        {

            get;

 

        }

        static object mLockObject = new object();

        private static NClay.PropertyHandler[] mPHandlers;

        protected static NClay.PropertyHandler[] PHandlers

        {

            get

            {

                if (mPHandlers == null)

                {

                    lock (mLockObject)

                    {

                        CreateHandlers();

                    }

                }

                return mPHandlers;

            }

        }

        static void CreateHandlers()

        {

            if (mPHandlers == null)

            {

                PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public);

                mPHandlers = new NClay.PropertyHandler[properties.Length];

                for (int i = 0; i < properties.Length; i++)

                {

                    mPHandlers[i] = new NClay.PropertyHandler(properties[i]);

                }

            }

        }

        public object ConvertTo(string value, out bool succeeded)

        {

            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();

            sw.Reset();

            sw.Start();

            HttpRequest request = HttpContext.Current.Request;

            int recordcount = 0;

            string[] values;

            T item;

            IList<T> items = new List<T>();

            Dictionary<NClay.PropertyHandler, string[]> propertyvalues = new Dictionary<NClay.PropertyHandler, string[]>();

            NClay.MVC.Binder.IStringConverter pconverter;

            bool iscomplete;

            object pvalue;

            foreach (NClay.PropertyHandler pinfo in PHandlers)

            {

                values = GetPropertyValue(request, pinfo.Property.Name);

                if (values != null)

                {

                    if (values.Length > recordcount)

                        recordcount = values.Length;

 

                }

                propertyvalues.Add(pinfo, values);

            }

            for (int i = 0; i < recordcount; i++)

            {

                item = new T();

                foreach (NClay.PropertyHandler pinfo in PHandlers)

                {

                    values = propertyvalues[pinfo];

                    if (values != null)

                    {

                        pconverter = NClay.MVC.Binder.ConverterFactory.Converters[pinfo.Property.PropertyType];

                        if (pconverter != null)

                        {

                            if (i < values.Length)

                            {

                                pvalue = pconverter.ConvertTo(values[i], out iscomplete);

                                if (iscomplete)

                                    pinfo.Set(item, pvalue);

                            }

                        }

                    }

                }

                items.Add(item);

            }

            succeeded = true;

            sw.Stop();

            HttpContext.Current.Response.Write("绑定耗时:"+sw.Elapsed.TotalMilliseconds+"毫秒");

            return items;

        }

        private string[] GetPropertyValue(HttpRequest request, string name)

        {

            string[] values = null;

            values=request.Params.GetValues(Prefix + "." + name);

            if(NClay.Common.IsEmpty(values))

                values = request.Params.GetValues(Prefix +  name);

            if (NClay.Common.IsEmpty(values))

                values = request.Params.GetValues(Prefix + "_" + name);

           

            return values;

        }

 

        #endregion

 http://www.nclay.cn/test/bindtest.aspx

下载代码

posted on 2007-09-30 09:05  henry  阅读(2235)  评论(7编辑  收藏  举报

导航