Asp.net下的对象成员数据绑定器实现 2
点击次数:14 次 发布日期:2008-11-26 12:01:22 作者:源代码网
|
源代码网推荐 虽然工厂可以达到转换接口的可配置性,但实际上很难达到应用要求;在某些情况下类型转换器只是在某些对象成员中有效(虽然配置文件也可以达到期要求,但在配置文件中定义这么小的粒度并不是好的选择);通过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)。 源代码网推荐 源代码网供稿. |
