【阿不】深入ASP.NET数据绑定(下)—多样的绑定方式
在这个系列的上篇中介绍了数据绑定语法的原理以及.NET中如何实现单向绑定,中篇我们简单的介绍了ASP.NET 2.0 中新增的Bind语法配合DataSourceControl来实现数据的自动双向绑定。这两部分的内容相对动态抽象并且不常接触,没有很好的源代码支持很难解释清楚,要想真正弄清它们的内部原理,还需要大家亲自动手去反编译分析动态编译的程序集。
在了解了数据绑定语法的原理后,我还想来谈谈我中实践过程中遇到的一些问题以及其它实用的绑定技巧。首先我们就来说说,特殊字段名的问题。我们知道在数据库当中,如果表名或字段名中包含有一些特殊的不能是合法的字符时,都会使用[]将它们引起来,以便他们能够正常使用。但是在的绑定语句当中,同时可以使用[],但是对于字段名中包含 "(",")","[","]"这4个字符却始终运行出错。假设像我下面这样来绑定"电压(V)":
# Eval("电压(V)")%>
那么就会得到一个运行时错误:
DataBinding:“System.Data.DataRowView”不包含名为“电压”的属性。
表明括号是被认为是一个特殊字符,那我们如果给字段名加上[],如下:
# Eval("[电压(V)]")%>
此时,我们会得到另一个运行时错误:
电压(V 既不是表 DataTable1 的 DataColumn 也不是 DataRelation。
表明,即使加上[]也无法解决这个特殊字段名的问题。同时字段名中如果也存在中括号,也是会出现这样的问题的。但是这样的字段名却在GridView的自动生成列中能被正常绑定呢?问题会出现在哪里呢?分析和对比GridView的自动生成列与Eval这样的绑定语法在最终执行绑定代码上的不同,我们可以发现,GridView的自动生成列取值并不是使用DataBinder.Eval这个方法,它内部有自己的取值方式,但是在实现上却是大同小异的。那究竟是在哪里出现了问题呢?我们找出DataBinder类的定义:
[AspNetHostingPermission(SecurityAction.LinkDemand, Level=200)]
DataBinder
{
[] expressionPartSeparator = [] { };
[] indexExprEndChars = [] { , };
[] indexExprStartChars = [] { , };
Eval( container, expression)
{
(expression == )
{
ArgumentNullException();
}
expression = expression.Trim();
(expression.Length == 0)
{
ArgumentNullException();
}
(container == )
{
;
}
[] expressionParts = expression.Split(expressionPartSeparator);
Eval(container, expressionParts);
}
Eval( container, [] expressionParts)
{
propertyValue = container;
( i = 0; (i < expressionParts.Length) && (propertyValue != ); i++)
{
propName = expressionParts[i];
(propName.IndexOfAny(indexExprStartChars) < 0)
{
propertyValue = GetPropertyValue(propertyValue, propName);
}
{
propertyValue = GetIndexedPropertyValue(propertyValue, propName);
}
}
propertyValue;
}
Eval( container, expression, format)
{
obj2 = Eval(container, expression);
((obj2 == ) || (obj2 == DBNull.Value))
{
.Empty;
}
(.IsNullOrEmpty(format))
{
obj2.ToString();
}
.Format(format, obj2);
}
GetDataItem( container)
{
flag;
GetDataItem(container, flag);
}
GetDataItem( container, foundDataItem)
{
(container == )
{
foundDataItem = ;
;
}
IDataItemContainer container2 = container IDataItemContainer;
(container2 != )
{
foundDataItem = ;
container2.DataItem;
}
name = ;
PropertyInfo property = container.GetType().GetProperty(name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
(property == )
{
foundDataItem = ;
;
}
foundDataItem = ;
property.GetValue(container, );
}
GetIndexedPropertyValue( container, expr)
{
(container == )
{
ArgumentNullException();
}
(.IsNullOrEmpty(expr))
{
ArgumentNullException();
}
obj2 = ;
flag = ;
length = expr.IndexOfAny(indexExprStartChars);
num2 = expr.IndexOfAny(indexExprEndChars, length + 1);
(((length < 0) || (num2 < 0)) || (num2 == (length + 1)))
{
ArgumentException(SR.GetString(, [] { expr }));
}
propName = ;
obj3 = ;
s = expr.Substring(length + 1, (num2 - length) - 1).Trim();
(length != 0)
{
propName = expr.Substring(0, length);
}
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12639172/viewspace-402162/,如需转载,请注明出处,否则将追究法律责任。
<%=items[i].content%>
<%if(items[i].items.items.length) { %>
<%=items[i].items.items[j].username%> 回复 <%=items[i].items.items[j].tousername%>: <%=items[i].items.items[j].content%>
<%}%> <%if(items[i].items.total > 5) { %>
<%}%>
<%}%>
<%}%>
转载于:http://blog.itpub.net/12639172/viewspace-402162/
【阿不】深入ASP.NET数据绑定(下)—多样的绑定方式相关推荐
- 深入ASP.NET数据绑定(中)——数据双向绑定机理
转载自 阿不 http://hjf1223.cnblogs.com/ 在上一篇<深入ASP.NET数据绑定(上)>中,我们分析了在.NET中的数据绑定语法的一些内部机理.简单说来就是ASP ...
- 深入ASP.NET数据绑定(上)
转载自阿不 http://hjf1223.cnblogs.com/ 在ASP.NET我们在使用Repeater,DetailsView,FormView,GridView等数据绑定模板时,都会使用&l ...
- ASP.NET Core MVC四种枚举绑定方式
前言 本节我们来讲讲在ASP.NET Core MVC又为我们提供了哪些方便,之前我们探讨过在ASP.NET MVC中下拉框绑定方式,这节我们来再来重点看看枚举绑定的方式,充分实现你所能想到的场景,满 ...
- ASP.NET 数据绑定详解 代码+步骤
文章目录 1. 数据绑定概述 2. 简单数据绑定 2.1. 属性绑定 2.2. 表达式绑定 2.3. 集合绑定 2.4. 方法绑定 3. 数据控件绑定 3.1. ListControl 控件 3.2. ...
- 【阿不】深入ASP.NET数据绑定(上)
在ASP.NET我们在使用Repeater,DetailsView,FormView,GridView等数据绑定模板时,都会使用或这样的语法来单向或双向绑定数据.但是我们却很少去了解,在这些语法的背后 ...
- 【阿不】深入ASP.NET数据绑定(中)—数据双向绑定机理
在上一篇<深入ASP.NET数据绑定(上)>中,我们分析了在.NET中的数据绑定语法的一些内部机理.简单说来就是ASP.NET在运行时为我们完成了页面的动态编译,并解析页面的各种服务器端代 ...
- ASP.NET环境下配置FCKEditor并上传图片及其它文件
文章转自:http://blog.sina.com.cn/s/blog_568e66230100hy6a.html FCKEditor于2009年被更名为新一代的CKEditor和CKFinder,见 ...
- asp.net环境下的静态类以及静态变量
在ASP.NET环境下,静态类最大的特点就是共享. 大家都知道,静态类是不能实例化的,我们直接使用它的属性与方法. 因此 我们可以做一些比较有意思的事情.比如说预热数据. public static ...
- Asp.Net Core下的开源任务调度平台ScheduleMaster
从何说起 2017年初的时候,由于当时项目需要做了一个乞丐版定时调度系统,那时候只在单机上实现了核心的调度功能.做这个玩意之前也调研了社区中开源的解决方案,找了几个实地部署试跑了一下,其实都很不错.但 ...
最新文章
- 宏基因组 微生物人注意了!这个微信群可以学英语,而且全程免费
- psw和fr微型计算机,微型计算机技术及应用习题答案
- 51CTO手機軟件有病毒? 有網絡安全的高手嗎?
- C#高性能大容量SOCKET并发(十一):编写上传客户端
- Linux知识积累(8)卸载安装jdk
- java程序解析perl文件_如何从shell脚本执行perl文件
- Unity3D两种方式播放视频
- c# 调用c库dll ,char*转string的解决办法
- AOP技术研究 再续
- Blazor Server 和 WebAssembly 应用程序入门指南
- 求到所有房子距离和最小的新房子
- 在32位的linux平台上为Oracle配置1.7GB的SGA
- 关于scanf 与 cin gets(),getline()......输入输出字符串的区别
- Mac OSX上卸载Anaconda
- TuxOnIce! 休眠到硬盘[zt]
- jaspersoft studio6.x 设计医院检查报告单样式
- 这些好用的抠图软件,助你实现一键抠图
- android scheme 配置多个,Android Scheme URL 使用方法
- 保健文汇杂志保健文汇杂志社保健文汇编辑部2022年第36期目录
- 用js做一个数字华容道