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

Reading number is top 10 articles
ASP.NET,2.0中CSS失效解决方案_.net资料_编程技术
PHP设计可旋转字母验证码码_[PHP教程]
项目调试时出现用到的一个组件“访问被拒绝”的解决方法_[Asp.Net教程]
delphi 判断文件结尾的函数eof函数和eoin函数
再现C#导出Excel源码_.net资料_编程技术
.NET自动字符编码识别程序库,NChardet_.net资料_编程技术
同步两个Sql,server(3)_[SQL,Server教程]
在ASP.NET中为GridView添加删除提示框_.net资料_编程技术
解决:操作必须使用一个可更新的查询_[Asp.Net教程]
.net生成静态页方法总结_[Asp.Net教程]
Reading number is top 10 pictures
陪睡门马睿菈自曝写真 称首拍大尺度照片3
The hot big eye big breast beauty1
你是左脑型还是右脑型
七步解决性冷淡
无题
奇趣的世界记录1
Exquisite decoration is not paying too much4
云南大理的美女
China's first snake village3
[猫扑大杂烩]华东师范墙上看到的捐精告示 15毫升3600元
Download software ranking
双旗镇刀客A
Unix video tutorial9
仙剑奇侠传98版歌曲
C语言教程TXT
The hero
株洲本地在线棋牌游戏
VC++6.0培训教程
Boxer's Top ten classic battle9
网页特效实例大全
美女写真3
delv published in(发表于) 2014/1/16 9:28:33 Edit(编辑)
Asp.net下的对象成员数据绑定器实现_[Asp.Net教程]

Asp.net下的对象成员数据绑定器实现_[Asp.Net教程]

Asp.net下的对象成员数据绑定器实现_[Asp.Net教程]

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

来源:http://www.cnblogs.com/henryfan/archive/2007/02/03/638777.html





添加到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.