学习交流,欢迎转载。转载请注明文章来源:http://www.cnblogs.com/lgjspace/archive/2011/01/12/2214013.html
细节:
ObjectDataSource 不仅仅是可以和强类型 DataSet 来连接,还可以和一个自己定义的类来连接,只要该类符合某些要求即可。
区别:
“<%%>”“<%=%>”“<%#%>”的区别:
“<%%>”是直接运行其中的代码;
“<%=%>”是把“=”后的表达式的值返回到当前的位置;
“<%#%>”是用在数据绑定的地方,如 Repeater、ListView 等的里面。
细节:
在 Repeater 中即使没有使用 AlternatingItem,在 Repeater_ItemDataBound() 事件中,偶数行的 e.ItemType 也是属于 AlternatingItem ,奇数行的 e.ItemType 属于 Item。
技巧:
无论是 WinForm 还是 WebForm 中,一般情况下,如果事件处理程序中的第二个参数 e 的类型不是默认的 EventArgs 类型,而是“××EventArgs”类型,则说明该参数 e 有额外的方法或属性可供使用。
经验:
开发互联网项目时,数据库的 ID 一般都使用的自动增长的 int 或 bigint 类型,因为 guid 在展示时不太友好。
细节:
在 ListView 自动生成的代码中, EmptyDataTemplate 标签里面的是当绑定的数据源没有数据时所显示的东西。
细节:
<%# Bind("Name") %> 和 <%# Eval("Name") %> 的区别:
Eval 是单向绑定,从把数据源中的数据绑定到客户端的页面中,方向是从数据源到页面;而 Bind 则是双向绑定,不仅仅是“从数据源到页面”这样的单方向。
细节:
1. 在 ListView 中并没有 Repeater 中的 HeaderTemplate 和 FooterTemplate,取而代之的是 LayoutTemplate。
2. 在 LayoutTemplate 中必须要有一个 ID 为“itemPlaceholder”的服务端控件(该控件 ID 名是可以更改的,方法是把该 LayoutTemplate 所在的 ListView 控件的“ItemPlaceholderID”属性的值改成你想要的 ID 名即可,默认为前面所说的“itemPlaceholder”),至于是什么控件则没有硬性规定。这个 ID 为“itemPlaceholder”的控件用来作为“HeaderTemplate”和“FooterTemplate”的划分界线,该控件之前是“HeaderTemplate”,之后是“FooterTemplate”。
经验:
在 ListView 的 ListView1_ItemDataBound 事件中,通过参数 e.Item “点”不出“DataItem”,原因出在,“e.Item”的默认类型是“ListViewItem”,经转型为“ListViewDataItem”后才可以点出 “DataItem”。
细节:
在 ListView 中,由于 AlternatingItemTemplate 和 ItemTemplate 的隔离而导致 FindControl() 方法查找控件的结果不全,如果要让 FindControl() 可以同时查找 AlternatingItemTemplate 和 ItemTemplate 两个 Template 下的控件,则要把这两个 Template 中最外层的控件都设为“runat="server"”,然后通过对这两个“runat="server"”的控件进行 FindControl() 来获得两个 Template 中的对应控件对象。
技巧:
在 ListView 中,如果不需要有隔行效果,完全可以直接删除掉标签“AlternatingItemTemplate”所囊括的内容。
细节:
注意 Repeater 和 ListView 在使用上的细微区别:
1. 判断数据行的类型使用“e.Item.ItemType == ListViewItemType.DataItem”
2. 取得行对应的 DataRowView 使用:“ListViewDataItem lvDataItem = (ListViewDataItem)e.Item;DataRowView rowView = (DataRowView)lvDataItem.DataItem;”
3. 在 FindControl 的时候注意 AlternatingItemTemplate 不同于 ItemTemplate 的问题。
细节:
在 ListView 的模板中使用 Validator 和平时使用时几乎一样,但 ControlToValidate 属性不再像一般使用时那样可以直接选择,需要手动填写,填写的内容即为需要验证的控件的 ID。此外,还要设定相应按钮、控件、Validator 为同样的 ValidationGroup,防止不同模板中的 Validator 互相干扰。将 Cancel 按钮的 CausesValidation 属性设为 false,以防止 Validator 的检验阻碍了 Cancel 按钮的取消功能。
细节:
ListView 的 ItemInserting 事件的参数 e 的属性 Values 即为要插入到数据库之前的数据的键值对。
经验:
在 ObjectDataSource 中绑定 Id 为 Guid 类型的表的时候会生成一个“DataObjectTypeName = "System.Guid"”,导致出现“找不到属性名为 Id”的错误,删掉该代码即可避免该问题。
细节:
在 ListView 控件里的任何一个模板都可以随意删除,不会影响其它的东西,用不着就可以随便删除,删除了模板只是会失去了和模板相应的功能而已。
重点经验:
通过自己亲身的测试发现:
在 .NET 3.5(VS2008)环境下,WebForm 中的服务器端数据绑定控件 ListView 的 ListView1_ItemDataBound 事件的参数 e 不可以直接通过 e.Item.DataItem 来直接“点”出 DataItem 属性,因为此时的 e.Item 的默认类型是 ListViewItem,而 DataItem 属性是要在类型为 ListViewDataItem 的对象才能“点”得出来,所以需要把“e.Item”进行强制的类型转换后才能点得出“DataItem”属性,即:“((ListViewDataItem)e.Item).DataItem”。而这种情况在 .NET 4.0(VS2010)环境下则不用进行强制类型转换,直接“e.Item.DataItem”就可以调出 DataItem 属性,因为此时的 e.Item 的类型不再是 .NET 3.5 中的 ListViewItem,而是变成了 ListViewDataItem 类型,所以可以直接“点”出 ListViewDataItem 类型对象的 DataItem 属性。
细节:
1. Row_Number() 函数是 SQL2005 之后提供的一个计算结果集行号的函数。
2. Row_Number() 函数返回的是查询出的结果集的与结果集 Id 完全无关的(从 1 开始的)行号,而不是数据表中的行号。
经验教训:
在服务器端用服务端控件的 Attributes[""] 属性为 ASP.NET 服务器控件 DropDownList 添加客户端的 javascript 事件时,由于在渲染到客户端的 Html 的过程中程序会对待添加的属性值的内容进行 HtmlEncode 操作,因此会造成渲染到客户端页面的事件出错。
如下面的代码:
ddlLinkType.Attributes["onchange"] = "onLinkTypeChange(this,'" + txtLogoUrl.ClientID + "');";
但渲染后的结果却是:
<select onchange="onLinkTypeChange(this,'ctrl10_LogoUrlTextBox');" id="lvLinks_ddlLinkType" name="lvLinks$ctrl10$ddlLinkType">
渲染后的代码中,原本需要直接渲染的单引号“'”却被 Encode 成“'”了,导致触发事件时传入的参数出错。
唯一的解决方法就是避免出现这种情况的出现。例如,可以通过“<%=**** %>”的方式取值来代替通过函数参数的方法传值。
细节:
javascript 中的 "字符串abcd".charAt(序号) 返回的是字符串“字符串abcd”中以 0 开始的第“序号”个字符,如果“序号”的类型是字符或字符串,该方法会首先尝试把字符或字符串类型的“序号”转化为数字类型,例如把字符串类型的“"15"”转换为整型的“15”,然后再取出字符串中相应序号的字符,如果转换失败,会默认返回字符串“"字符串abcd"”中的第一个字符(这里为"字")。
教训:
当使用 RequiredFieldValidator 验证控件验证 DropDownList 时,RequiredFieldValidator 控件的 InitialValue 属性所指代的是 DropDownList 的 Value 值,而并非 Text 值。如果 DropDownList 的显示的文本(Text 值)和显示的文本所代表的值(Value 值)不是同一个值的话就需要注意两者的区别。
经验:
JQuery 中的 change() 事件触发的时机是控件的值改变之后的瞬间,注意是在控件的值改变之后,而不是改变之前,例如,在类型为 checkbox 的 input 标签的 change() 事件中,用 alert() 打印此时控件的选择值的话,如果触发事件是由于 checkbox 的“没选中”状态变成“选中”状态,则打印的选择值应该是“选中”状态,这说明了打印状态值的时候 checkbox 的选中状态已经不是“没选中”而是“选中”了。
经验:
JQuery 中的“$("#checkboxSunday").attr("checked")”返回的不是字符串“"checked"”,而是布尔值的 true 或 false,如果要用该返回值来作判断的话则要注意。
然而,如果要为控件的“checked”属性赋值,则既可以用布尔值的 true 或 false,也可以用“"checked"”或“""”来表示,两者皆可,如:“$("#checkboxSunday").attr("checked", true);”则表示把 Id 为 checkboxSunday 的 checkbox 标签的选中状态设为“选中”,即“勾上”了该 checkbox。
细节:
<input type = "button"></input> 按钮没有 onsubmit() 事件,只有 <form></form> 表单标签才有 onsubmit() 事件。