关于Repeater的回发问题!
大家好,问题是这样:
在页面上有个Repeater,代码如下:
- HTML code
<asp:Repeater ID="rep" runat="server" OnItemCommand="rep_ItemCommand"> <ItemTemplate> <tr> <td><%#DataBinder.Eval(Container.DataItem,"Id") %></td> <td><%#DataBinder.Eval(Container.DataItem,"Name") %></td> <td> <asp:LinkButton ID="lbtn" runat="server" CommandName="del" CommandArgument='<%#DataBinder.Eval(Container.DataItem,"Id") %>'>删除</asp:LinkButton> </td> </tr> </ItemTemplate> </asp:Repeater>
-------------------------------------
该页面生成后的html代码是这样:
- HTML code
var theForm = document.forms['form1'];if (!theForm) { theForm = document.form1;}function __doPostBack(eventTarget, eventArgument) { if (!theForm.onsubmit || (theForm.onsubmit() != false)) { theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument; theForm.submit(); }}//]]></script> <div> <table> <tr> <td>0</td> <td>Name0</td> <td> <a id="rep_ctl00_lbtn" href="javascript:__doPostBack('rep$ctl00$lbtn','')">删除</a> </td> </tr>......
------------------------------------------------
我知道,控件通过__doPostBack向服务器进行回发,回发后,页框架就会搜索发送的内容,确定__EVENTTARGET.value的值是否与页面上实现了IPostBackEventHandler的服务器控件的Id相对应,如果对应了,调用该服务器控件的RaisePostBackEvent方法,从而达到回调服务器控件的服务端方法。
------------------------------------------------
问题是:
首先,我看Repeater并没有继承IPostBackEventHandler事件(它继承的Control和INamingContainer,同样这两个也都没有继承IPostBackEventHandler接口),那Repeater怎么捕捉的回发事件呢?
其次,即便Repeater通过某种方式,捕捉到了回发事件,看页面上,所有的linkButton生成的html代码变成了 <a id="rep_ctl00_lbtn" href="javascript:__doPostBack('rep$ctl00$lbtn','')">删除</a>,由于Repeater继承了INamingContainer,所以linkbutton的名字变成了rep$ctl00$lbtn,这样的话,在回发的时候,岂不是会去调用服务器控件ID为rep$ctl00$lbtn的事件了吗?而且这个Id的控件是没有的,所以应该找不到,它怎么会去调用Repeater的rep_ItemCommand事件呢?
----------------------------------------------------
请各位大侠不吝赐教,谢谢。
[解决办法]
没人回,分这么多!
问题解决吗!
[解决办法]
- C# code
public class MyView : System.Web.UI.Control, System.Web.UI.IPostBackEventHandler public void RaisePostBackEvent(string eventArgument) { this.Initialize(); string[] parts = eventArgument.Split('='); string commandName = parts[0]; string value = (parts.Length > 1 ? parts[1] : null); switch (commandName .ToLower()) { case "Command1": .......
[解决办法]
http://hi.baidu.com/trip008/blog/item/85c49b19c633954042a9adea.html 查了一下 也学习了一下 感觉 不是很懂 呵呵
[解决办法]
repeater没有实现这个接口,但你的代码中
使用了asp:LinkButton这个模板,linkbutton继承了IPostBackEventHandler
[解决办法]
------解决方案--------------------
赶得好不如赶得巧。。
[解决办法]
rep$ctl00$lbtn这个是Name,不是Id
[解决办法]
[解决办法]
来抄底来了