All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
Sql Server2005登录失败_[SQL Server教程]
ASP.NET底层架构探索之进入ASP.NET_.net资料_编程技术
PHP5中的this,self和parent关键字详解_[PHP教程]
常用技巧:用PHP控制您的浏览器cache_php资料_编程技术
关于.NET动态代理的介绍和应用简介_[Asp.Net教程]
ASP.NET2.0数据库之SQL,Server安全性_[Asp.Net教程]
SQL,Server,2008,R2官方上市日期出炉_mssql学习_编程技术
C#中构造函数和析构函数
.NET3.5和VS2008中的ASP.NET,AJAX_[Asp.Net教程]
C#闪烁问题解决方法_.net资料_编程技术
Reading number is top 10 pictures
徐若瑄展示美丽胸围2
9.3阅兵全景图5-地空反舰导弹梯队
浴室里的美女
29 the belle stars after bath figure1
This is heaven to some path
Wild animals melee moment of life and death2
Is said to be a Chinese female artist fame explicit pictures before2
Startling Russian girl blind date scene3
yy365网站上的美女3
这才是真正的人体艺术2
Download software ranking
豪门浪荡史
I for your crazy
Unix video tutorial17
Tram sex maniac 2 (H) rar bag4
Tram sex maniac 2 (H) rar bag11
网络管理员第三版
仙剑奇侠传98硬盘WINXP版
Boxer's Top ten classic battle1
The Bermuda triangle2
DreamWeaver8
aaa published in(发表于) 2013/12/15 8:41:39 Edit(编辑)
Asp.net下的对象成员数据绑定器实现_.net资料_编程技术

Asp.net下的对象成员数据绑定器实现_.net资料_编程技术

Asp.net下的对象成员数据绑定器实现_.net资料_编程技术-你的首页-uuhomepage.com

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


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


  OrderSearch search = FormContext.BindObject();
  Orders order = FormContext.BindObject("order");


  制定规则和约束


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


  


  xxxx.LastName、xxxx_LastName或xxxxLastName等。在绑过程可以指定前缀进行对象成员的绑定;不过在webForm控件的Name是asp.net生成的,在关系分析上就相对复杂些。


  类型转换接口的定义


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


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工厂的实现


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


static IDictionary mConverters;
public static IDictionary Converters
{
get
{
if (mConverters == null)
{
lock (typeof(ConverterFactory))
{
OnInit();
}
}
return mConverters;
}
}
static void OnInit()
{
if (mConverters != null)
return;
mConverters = new Dictionary();
mConverters.Add(typeof(byte), new ToByte());
LoadConfig();
}
//从配置文件加载转换器映射,如果配置存在相同类型转器就取代原有转换器
static void LoadConfig()
{
//Load Config
// }


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


可以扩展性的Custom Attribute


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


///


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

[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 mConverters = new Dictionary();
#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下工作;有更好想法的朋友请多提交意见。





添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.