当前位置:首页 > 网络编程 > WEB编程 > ASP.net >  Asp.net下的对象成员数据绑定器实现 2

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

点击次数:14 次 发布日期:2008-11-26 12:01:22 作者:源代码网
源代码网推荐      可以扩展性的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;
源代码网推荐  
源代码网推荐   public String DefaultValue
源代码网推荐  
源代码网推荐   {
源代码网推荐  
源代码网推荐   get
源代码网推荐  
源代码网推荐   {
源代码网推荐  
源代码网推荐   return mDefaultValue;
源代码网推荐  
源代码网推荐   }
源代码网推荐  
源代码网推荐   set
源代码网推荐  
源代码网推荐   {
源代码网推荐  
源代码网推荐   mDefaultValue = value;
源代码网推荐  
源代码网推荐   }
源代码网推荐  
源代码网推荐   }
源代码网推荐  
源代码网推荐   protected IStringConverter CreateInstance()
源代码网推荐  
源代码网推荐   {
源代码网推荐  
源代码网推荐   if (mConverters.ContainsKey(ConverterType))
源代码网推荐  
源代码网推荐   return mConverters[ConverterType];
源代码网推荐  
源代码网推荐   lock (typeof(ConverterAttribute))
源代码网推荐  
源代码网推荐   {
源代码网推荐  
源代码网推荐   if (!mConverters.ContainsKey(ConverterType))
源代码网推荐  
源代码网推荐   {
源代码网推荐  
源代码网推荐   mConverters.Add(ConverterType, (IStringConverter)Activator.CreateInstance(ConverterType));
源代码网推荐  
源代码网推荐   }
源代码网推荐  
源代码网推荐   return mConverters[ConverterType];
源代码网推荐  
源代码网推荐   }
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐   }
源代码网推荐  
源代码网推荐   static IDictionary<Type, IStringConverter> mConverters = new Dictionary<Type, IStringConverter>();
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐   #region IStringConverter 成员
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐   public object ConvertTo(string value, out bool succeeded)
源代码网推荐  
源代码网推荐   {
源代码网推荐  
源代码网推荐   string newvalue = value != null ? value : DefaultValue;
源代码网推荐  
源代码网推荐   return CreateInstance().ConvertTo(newvalue, out succeeded);
源代码网推荐  
源代码网推荐   }
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐   #endregion
源代码网推荐  
源代码网推荐   }
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐  通过ConverterAttribute可以方便制定粒度更小的配置
源代码网推荐  
源代码网推荐  private byte[] mFileStream;
源代码网推荐  
源代码网推荐   [Converter(typeof(FileStreamConverter),"IconPhoto")]
源代码网推荐  
源代码网推荐   public byte[] FileStream
源代码网推荐  
源代码网推荐   {
源代码网推荐  
源代码网推荐   get
源代码网推荐  
源代码网推荐   {
源代码网推荐  
源代码网推荐   return mFileStream;
源代码网推荐  
源代码网推荐   }
源代码网推荐  
源代码网推荐   set
源代码网推荐  
源代码网推荐   {
源代码网推荐  
源代码网推荐   mFileStream = value;
源代码网推荐  
源代码网推荐   }
源代码网推荐  
源代码网推荐   }
源代码网推荐  
源代码网推荐  以上定义可以上传文件流转成byte[]到FileStream属性中。
源代码网推荐  
源代码网推荐  功能集成实现
源代码网推荐   现在就把所有东西集成起来,满足目的的要求。
源代码网推荐  
源代码网推荐   public object Bind(System.Collections.Specialized.NameValueCollection values, string prefix)
源代码网推荐  
源代码网推荐   {
源代码网推荐  
源代码网推荐   object newobj = Activator.CreateInstance(ObjectType);
源代码网推荐  
源代码网推荐   if (prefix == null)
源代码网推荐  
源代码网推荐   prefix = "";
源代码网推荐  
源代码网推荐   object value;
源代码网推荐  
源代码网推荐   foreach (PropertyInfo item in Properties)
源代码网推荐  
源代码网推荐   {
源代码网推荐  
源代码网推荐   value = values[prefix + "." + item.Name];
源代码网推荐  
源代码网推荐   if(value == null)
源代码网推荐  
源代码网推荐   value = values[prefix + "_" + item.Name];
源代码网推荐  
源代码网推荐   if(value == null)
源代码网推荐  
源代码网推荐   value = values[prefix + item.Name];
源代码网推荐  
源代码网推荐   BindProperty(newobj, item, (string)value);
源代码网推荐  
源代码网推荐   }
源代码网推荐  
源代码网推荐   return newobj;
源代码网推荐  
源代码网推荐   }
源代码网推荐  
源代码网推荐   private void BindProperty(object obj, PropertyInfo property, string value)
源代码网推荐  
源代码网推荐   {
源代码网推荐  
源代码网推荐   IStringConverter stringconver;
源代码网推荐  
源代码网推荐   object nvalue;
源代码网推荐  
源代码网推荐   bool confirm = false;
源代码网推荐  
源代码网推荐   Object[] cas = property.GetCustomAttributes(typeof(ConverterAttribute), true);
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐   if (cas.Length > 0)
源代码网推荐  
源代码网推荐   {
源代码网推荐  
源代码网推荐   nvalue = ((ConverterAttribute)cas[0]).ConvertTo(value, out confirm);
源代码网推荐  
源代码网推荐   if (confirm)
源代码网推荐  
源代码网推荐   mPropertiesHandle[property].SetValue(obj, nvalue);
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐   }
源代码网推荐  
源代码网推荐   else
源代码网推荐  
源代码网推荐   {
源代码网推荐  
源代码网推荐   if (ConverterFactory.Converters.ContainsKey(property.PropertyType))
源代码网推荐  
源代码网推荐   {
源代码网推荐  
源代码网推荐   stringconver = ConverterFactory.Converters[property.PropertyType];
源代码网推荐  
源代码网推荐   nvalue = stringconver.ConvertTo(value, out confirm);
源代码网推荐  
源代码网推荐   if (confirm)
源代码网推荐  
源代码网推荐   mPropertiesHandle[property].SetValue(obj, nvalue);
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐   }
源代码网推荐  
源代码网推荐   }
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐   }
源代码网推荐  
源代码网推荐  因为Web提交的数据几乎可以通过HttpRequest.Params得到,只需要根据属性名称和相关前缀进行匹配查找就可以了。这里实现的匹配方式并不理想,其实可以在相关page第一次请求就可以分析到关系存在IDictionary中,后期直接使用就可以了。
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐   以上功能是在编写一个MVC组件的数据绑定功能,其实完全可以移植传统的WebForm下工作;有更好想法的朋友请多提交意见。
源代码网推荐  
源代码网推荐  
源代码网推荐    做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。
源代码网推荐


源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华