【阿不】深入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/,如需转载,请注明出处,否则将追究法律责任。

user_pic_default.png
请登录后发表评论 登录
全部评论
<%=items[i].createtime%>

<%=items[i].content%>

<%if(items[i].items.items.length) { %>
<%for(var j=0;j
<%=items[i].items.items[j].createtime%> 回复

<%=items[i].items.items[j].username%>   回复   <%=items[i].items.items[j].tousername%><%=items[i].items.items[j].content%>

<%}%> <%if(items[i].items.total > 5) { %>
还有<%=items[i].items.total-5%>条评论 ) data-count=1 data-flag=true>点击查看
<%}%>
<%}%>
<%}%>

转载于:http://blog.itpub.net/12639172/viewspace-402162/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值