【发布时间】:2009-01-23 21:16:24
【问题描述】:
我有一系列使用 asp:repeater 生成的行:
<asp:repeater ID="itemsRepeater"
OnItemDataBound="itemsRepeater_ItemDataBound"
runat="Server">
<itemtemplate>
<tr>
<td>
<asp:HyperLink ID="linkView" runat="server"
Text="<%# GetItemText((Item)Container.DataItem) %>"
NavigateUrl="<%# GetViewItemUrl((Item)Container.DataItem) %>" />
</td>
<td>
<asp:HyperLink ID="linkDelete" runat="server"
Text="Delete"
NavigateUrl="<%# GetDeleteUrl((ActionItem)Container.DataItem) %>" />
</td>
</tr>
</itemtemplate>
</asp:repeater>
转发器创建一个 HTML 表格,每一行都包含一个项目的链接和(本质上是)一个“删除”链接。上面的简化示例代码生成的 HTML 类似于:
<TR>
<TD>
<A href="ViewItem.aspx?ItemGuid={19a149db-5675-4eee-835d-3d78372ca6f9}">
AllisonAngle_SoccerGirl001.jpg
</A>
</TD>
<TD>
<A href="DeleteItem.aspx?ItemGuid={19a149db-5675-4eee-835d-3d78372ca6f9}">Delete</A>
</TD>
</TR>
现在一切正常,但我想将“删除”转换为客户端。我希望能够单击该链接,它会在客户端 javascript 上:
- 提示“您确定...”的警报
- 有 javascript 问题服务器命中以实际删除他们想要的项目
- 从客户端 DOM 树中删除项目
所以有四个问题需要解决:
- 如何将 JavaScript 连接到客户端单击 删除 链接。
- 如何知道用户点击了什么项目删除
- 防止回发
- 删除用户点击的行
这是我的问题。
从这里你会发现我漫无目的的尝试来解决它。不要将以下任何内容视为与任何可能接受的解决方案有任何关系。仅仅因为我在下面发布了代码,并不意味着它是有用的。这并不意味着我在最佳解决方案的距离之内。而且因为我不能让任何事情低于工作 - 它一定走错了路。
我的尝试
连接 Javascript
第一个任务是将删除链接从 HTML 转换为:
<A href="DeleteItem.aspx?ItemGuid={19a149db-5675-4eee-835d-3d78372ca6f9}">
Delete
</A>
变成更javascripty的东西:
<A href="#"
onclick="DeleteItem('DeleteItem.aspx?ItemGuid={19a149db-5675-4eee-835d-3d78372ca6f9}')">
Delete
</A>
并添加脚本:
<script type="text/javascript">
//<![CDATA[
function DeleteItem(deleteUrl)
{
//Ask the user if they really want to
if (!confirm("Are you sure you want to delete INSERT NAME HERE?"))
{
return false;
}
//Call returns false if the server returned anything other than OK
if (!DoAjaxHit(deleteUrl)
{
return false;
}
//Remove the table row from the browser
var tableRow = document.getElementById("TODO-WHAT ID");
if (row != null)
{
//TODO: how to delete the tableRow from the DOM tree?
//document.Delete(tableRow) ?
}
//return false to prevent a postback
return false;
}
//]]>
</script>
可以使用什么 ASP 代码组合来创建上述内容?我听说 asp:LinkButton 有一个 OnClientClick 事件,您可以在其中连接一个 javascript 函数:
<asp:LinkButton ID="linkDelete" runat="server"
Text="Delete"
OnClientClick="DeleteItem(<%# GetDeleteUrl((ActionItem)Container.DataItem) %>);"/>
问题是呈现的 HTML 字面上包含:
<a onclick="DeleteItem(<%# GetDeleteUrl((ActionItem)Container.DataItem)) %>);" ...>
Delete
</a>
如果我将客户端点击事件处理程序更改为:
OnClientClick="DeleteItem('todo - figure this out');"/>
它可以工作 - 以及“todo - 解决这个问题”也可以工作。
防止回发
实际上发生了上面的 javascript 调用(我可以看到我的警报),但还有下一个问题:从 javascript 函数返回 false 不会阻止回发。事实上,我可以看到生成的html代码上的href不是“#”,而是
javascript:__doPostBack('ctl0....
我自己尝试更改 ASPX 代码以包含 OnClick 处理程序:
OnClick="#"
OnClientClick="DeleteItem('todo - figure this out');"
但编译器认为磅侧是杂注,并抱怨:
预处理器指令必须显示为 第一个非空白字符 一行
表行标识
表格行没有ID,它们是由asp:repeater生成的。
javascript函数如何知道是什么触发了点击事件? javascript 需要能够找到元素,并将其从树中删除。
注意:我当然更喜欢淡入淡出+折叠动画。
通常你会通过使用来获得一个元素
var tr = document.getElementById("the table row's id");
但表格行没有容易知道的 ID。由于存在多行,因此服务器在构建表时会生成 ID。我意识到一些解决方案将不得不涉及改变:
<TR>
进入
<TR runat="server">
这样每个表行都会有服务器生成的标识,但是我如何从 javsscript 引用生成的名称?
通常我会认为脚本问题可以通过使用多个参数来解决:
function DeleteItem(tableRowElement, deleteUrl)
{
//Do a web-hit of deleteUrl to delete the item
//remove tableRowElement DOM object from the document tree
}
但问题只是被推到了别处:如何填充 tableRowElement 和 deleteUrl 以调用 javascript 函数?
这样一个简单的问题:将点击从回发转换为客户端。
所涉及的问题数量变得非常愚蠢。这似乎表明
- 想法解决方案完全不同
- 没有解决办法
参考文献
Stackoverflow: How do I fade a row out before postback?
Stackoverflow: Javascript before asp:ButtonField click
【问题讨论】:
-
六个小时无处可去,我可以花一个小时编写一个问题
-
你愿意使用jQuery吗?
-
取决于它是否免费并且除了将程序集 dll 安装到 bin 文件夹之外不需要任何设置
-
它是免费的,除了组装ddl之外不需要任何设置。这是一个很好的资源,可以为您以前可能没有想到的一些很酷的功能打开许多大门。
-
在这个问题得到解决之前我不会看它;否则我只是在玩一些没有实际应用的东西。