扩展数据绑定到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

 

下载代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值