手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Asp.Net编程>列表

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

来源:互联网 作者:west263.com 时间:2008-02-22
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

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下工作;有更好想法的朋友请多提交意见。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!