asp.net 如何获得正确< button>的ID的回发?

cnjp1d6j  于 2023-03-04  发布在  .NET
关注(0)|答案(2)|浏览(199)

我正在基于数据库内容生成一些动态html,并将其作为一个LiteralControl插入到我的一个webforms页面中。除了我在相关数据的每一行中添加的几个按钮之外,所有这些看起来都很好,并且工作正常。我生成了唯一的按钮ID,如下所示。因此,对于第1项,子项2...我将有editbtn 12和trashbtn 12。如果我单击EDIT按钮,PageLoad回发代码将执行以下操作:字符串ctrlName =页面请求参数获取(“__事件目标”);并且我在ctrlName中看到“editbtn 12”。但是,单击同一行上的垃圾按钮,我得到了相同的结果:“editbtn 12”。对于每一行都发生这种相同的行为;例如,点击垃圾14,回发看到编辑14,等等。什么可能导致这一点?我被难倒了!TIA的任何想法!

<button id = "editbtn12" type = "submit" 
runat = "server" onclick = "__doPostBack('editbtn12','Edit 1 2')"
title = "Edit" style = "border:none; height:30px;width:30px; margin-left:initial;
margin-top:initial; padding:initial" >
img src = "Images/TinyEditBtn.png"  />
</button >               
<button id = "trashbtn12" type = "submit"
runat = "server" onclick = "__doPostBack('trashbtn12','Trash 1 2')"
title = "Trash" style = "border:none; height:30px;width:30px; margin-left:initial;
margin-top:initial; padding:initial" >
<img src = "Images/TinyTrashBtn.png" />
</button >
oprakyz7

oprakyz71#

您遇到的问题是,单击“垃圾”按钮会生成与单击“编辑”按钮相同的__EVENTTARGET参数,这会导致代码中出现意外行为。此问题似乎是由于两个按钮具有相同的type属性值“提交”而导致的,这可能会导致它们的行为相似。
这个问题的一个可能的解决方案是将两个按钮的type属性都从“submit”改为“button”,如下所示:

<button id="editbtn12" type="button" runat="server" onclick="__doPostBack('editbtn12','Edit 1 2')" title="Edit" style="border:none; height:30px;width:30px; margin-left:initial; margin-top:initial; padding:initial">

将type属性更改为“button”可以防止按钮提交表单并生成相同的__EVENTTARGET参数,这样可以让代码区分EDIT和TRASH按钮并分别处理它们。

svmlkihl

svmlkihl2#

几件事:
首先,__DoPostBack()在默认情况下并不总是在网页上可用!!!
有很多种方法可以"强制"或者实际上"希望"将__doPostBack函数添加到页面中。因此,添加某些控件(如一些repeater控件-网格视图等)会导致这种情况发生。
但是,默认情况下,没有,js函数__DoPostBack()不可用。
过去在您的代码中,运行并点击f12浏览器调试工具。在不到30秒的时间内,您将看到/找到/知道__dopostback函数错误"未找到"将发生。
但是请记住,默认情况下它不可用。
一个简单的方法是确保您在脚本管理器下降。
现在,这个标记:

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>

<button id="editbtn12" type="button"
    runat="server" 
    onclick="__doPostBack('editbtn12','Edit 1 2')"
    title="Edit" 
    style="border: none; height: 30px; width: 30px; margin-left: initial; margin-top: initial; padding: initial"
                
        >
</button>
<br />

<button id="trashbtn12" type="button"
    runat="server" 
    onclick="__doPostBack('trashbtn12','Trash 1 2')"
    title="Trash" style="border: none; height: 30px; width: 30px; margin-left: initial; margin-top: initial; padding: initial"
    >
       
</button>

而且,您会发现在大多数情况下,您必须关闭页面的验证。
所以,在top page指令中,你需要这样说:

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="WebForm4.aspx.vb" 
    Inherits="TestWeb.WebForm4"     
    EnableEventValidation="false"
    %>

(add启用事件验证=假)。以上是从一个vb页面,但它真的不重要。
但是,这里是真正的问题?
注入这些按钮的代码看起来是怎样的?
在100种情况中有99种情况下,某种类型的列表视图或repeater可以(也应该使用)。
这样,您只需放入按钮,让www.example.com为您重复按钮和数据,并且您可以使用+have regular plain jane server side click events来实现此目的。dasp.net do the magic of repeating the buttons and data for you, and you can use + have regular plain jane server side click events for this purpose. d
换句话说,要避免使用"黑客"式的方法。
不过,以上方法将起作用。
当然,也要清除第二个按钮中的"垃圾":
这一点:

onclick = "`enter code here`__doPostBack('trashbtn12','Trash 1 2')"

当然是这样的

onclick = "__doPostBack('trashbtn12','Trash 1 2')"

所以,你有很多流浪垃圾在这里。
除非你能提出一个很好的理由来解释为什么你要用代码来注入和添加这些按钮?
然后使用中继器,或重复类型的控制为此目的,你很高兴你这样做了。

相关问题