日期:2014-05-18  浏览次数:20342 次

关于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
------解决方案--------------------
探讨
ok了,大家赶快来接分啊,要结贴了。

------解决方案--------------------