问题描述
各位大侠我想请问__dopostback在repeater中使用后,服务器端是怎么处理的?也就是说服务器端怎么知道我当前获取的是repeater中的哪一行。部分代码如下<aid="repCollegeList_lbSelect_0"href="javascript:__doPostBack('repCollegeList$ctl01$lbSelect','')">选择</a>
解决方案
解决方案二:
首先,要在服务器端捕获事件,要选择一个支持此机制的控件。然后,要为这个控件绑定“自定义属性”,不用绕弯子去求别的什么东西来告诉你“当前获取的是的哪一行”。符合这样两个知识点,就可以写<arunat="server"onserverclick="abc_ServerClick"my-data-key='<%#Eval("field_name")%>'>选择</a>
protectedvoidabc_ServerClick(objectsender,EventArgse){varctl=(HtmlAnchor)sender;varkey=ctl.Attributes["my-data-key"];.......}
这里,把数据源中的一个字段field_name绑定到链接上,然后在链接被点击时,直接从服务器端事件中把所绑定的字段值取出来了。根本不用管它是放在Repeater控件还是别的什么控件中。把这个小事情设计明白了,放到任意的大的程序模块中也无可挑剔;相反地,纠结于Repeater,反而不会设计出好的代码。
解决方案三:
假设你不去绑定自定义属性,“绕一下”,怎样获得其它数据呢?假设在与你的Hyperlink相同级别还有一个Button控件,你可以使用varbtn=ctl.FindControl("Button1");
去获取它。你也可以使用varitem=(RepeaterItem)ctl.NamingContainer;
等方式来获取容器控件。这些虽然绕,但是也都是普通的asp.net知识范畴,都是按照原理来设计程序的思路。
解决方案四:
如果你是想理解onserverclick="abc_ServerClick"是如何起作用过的,我稍微说一点。实际上这需要学点asp.net控件开发入门知识,不过现在的asp.net基本上都是只“入门”,也就是说学的asp.net知识连15%都不到,因此缺乏这方面的基础。没有基础,可能你就觉得什么都很难懂;有了基础,就“刚好”能顺利理解一些东西。你可以打开上述代码的浏览器端的html源代码,可以看到<a>标签自动产生的href属性中,每一个__doPosrback函数的第一个参数都是不一样的,它实际上就对应着服务器端将来重建此Repeater对象时对于内部每一行中的HtmlAnchor的唯一标识,而且这个标识其实是按照namingcontainer层次去分层的(repCollegeList是第一层,ctl01是第二层,lbSelect是第三层)。当页面回发时,在页面post提交的参数中,有__EVENTTARGET和__EVENTARGUMENT表示在各种xxxChanged事件触发完毕之后还应该触发某一个postback回发事件,然后asp.net就按照上述“第一层、第二层、第三层”去找到相应的控件。如果找到符合此层次描述的控件,判断它是否实现了IPostBackEventHandler接口,如果实现了则调用RaisePostBackEvent方法(在你贴出的代码中,RaisePostBackEvent方法的第二个参数是"",既空串)。对于HtmlAnchor控件来说,你打开其源代码就能看到,它的RaisePostBackEvent方法中委派地触发了ServerClick事件。结果,当浏览器端页面回发时,就准确地触发了某一个HtmlAnchor控件的ServerClick事件,而其它的HtmlAnchor控件并不触发事件。这就是onserverclick="abc_ServerClick"所描述的功能。