如何正确命名和访问 Repeater 加载的元素 ID?
How to correctly name and access element IDs loaded with Repeaters?
我正在创建一个拖放式日程界面。用户可以将项目从右侧的选项卡列表拖到他们的日程表中。我使用中继器从 SQL 服务器加载工作人员。我目前正在使用大量 EVAL 来设置元素 ID。我想知道这是否是一种好的做法,或者是否有更好的方法来设置 ID?
我开发的下一步是由工作人员将 table 中的计划项目加载到每天,但我想在继续之前设置和理解 ID。之后,我将尝试在成功放置事件时触发 INSERT INTO 或 UPDATE(示例:UPDATE scheduleItems SET content = card text WHERE CrewID = xx AND date = xx)。这就是为什么我认为我的 ID 需要按顺序排列。
我是 ASP.NET Web 表单开发的新手,所以如果我的方法有偏差,请告诉我!
这是我的船员中继器:
<asp:Repeater ID="CrewRepeater" runat="server">
<ItemTemplate>
<div id="Crew<%# string.Format("{0}", Eval("CrewID"))%>" class="row">
<div class="board-layout">
<div class="left">
<div class="board-text">
Crew ID: <%# string.Format("{0}", Eval("CrewID"))%>
<div id='CrewList<%# string.Format("{0}", Eval("CrewID"))%>' class="crew-board-list">
<div id='Crew<%# string.Format("{0}", Eval("CrewID"))%>Employees' class="cardEmployee" data-toggle="modal" data-target="#DetailsModal" ondrop="dropIt(event)" ondragover="allowDrop(event)">
<p><%# string.Format("{0}", Eval("Members"))%></p>
</div>
<div id='Crew<%# string.Format("{0}", Eval("CrewID"))%>Equipment' class="cardEquipment">
<p><%# string.Format("{0}", Eval("Vehicles"))%></p>
</div>
</div>
</div>
</div>
<div id="BoardList<%# string.Format("{0}", Eval("CrewID"))%>" class="board-lists">
<div id="Sun<%# string.Format("{0}", Eval("CrewID"))%>" class="board-list" ondrop="dropIt(event)" ondragover="allowDrop(event)">
<%-- load schedule items here --%>
</div>
<div id="Mon<%# string.Format("{0}", Eval("CrewID"))%>" class="board-list" ondrop="dropIt(event)" ondragover="allowDrop(event)">
<%-- load schedule items here --%>
</div>
<div id="Tue<%# string.Format("{0}", Eval("CrewID"))%>" class="board-list" ondrop="dropIt(event)" ondragover="allowDrop(event)">
<%-- load schedule items here --%>
</div>
<div id="Wed<%# string.Format("{0}", Eval("CrewID"))%>" class="board-list" ondrop="dropIt(event)" ondragover="allowDrop(event)">
<%-- load schedule items here --%>
</div>
<div id="Thu<%# string.Format("{0}", Eval("CrewID"))%>" class="board-list" ondrop="dropIt(event)" ondragover="allowDrop(event)">
<%-- load schedule items here --%>
</div>
<div id="Fri<%# string.Format("{0}", Eval("CrewID"))%>" class="board-list" ondrop="dropIt(event)" ondragover="allowDrop(event)">
<%-- load schedule items here --%>
</div>
<div id="Sat<%# string.Format("{0}", Eval("CrewID"))%>" class="board-list" ondrop="dropIt(event)" ondragover="allowDrop(event)">
<%-- load schedule items here --%>
</div>
</div>
</div>
</div>
</ItemTemplate>
</asp:Repeater>
我的工作列表转发器:
<asp:Repeater ID="JobRepeater" runat="server">
<ItemTemplate>
<div id='cardJob<%# string.Format("{0}", Eval("Job"))%>' class="card" draggable="true" ondragstart="dragStart(event)">
<%--<asp:Label ID='lblJob' runat="server" Text='<%# string.Format("{0}", Eval("Job")) + " - " + string.Format("{0}", Eval("Description"))%>' />--%>
<p><%# string.Format("{0}", Eval("Job")) + " - " + string.Format("{0}", Eval("Description"))%></p>
</div>
</ItemTemplate>
</asp:Repeater>
我的拖拽JavaScript:
function allowDrop(ev) {
ev.preventDefault();
}
function dragStart(ev) {
ev.dataTransfer.setData("text", ev.target.id);
}
function dropIt(ev) {
ev.preventDefault();
let sourceId = ev.dataTransfer.getData("text");
let sourceIdEl = document.getElementById(sourceId);
let sourceIdParentEl = sourceIdEl.parentElement;
let targetEl = document.getElementById(ev.target.id)
let targetParentEl = targetEl.parentElement;
if (targetParentEl.id !== sourceIdParentEl.id) {
if (targetEl.className === sourceIdEl.className) {
targetParentEl.appendChild(sourceIdEl);
} else {
targetEl.appendChild(sourceIdEl);
}
} else {
let holder = targetEl;
let holderText = holder.textContent;
targetEl.textContent = sourceIdEl.textContent;
sourceIdEl.textContent = holderText;
holderText = '';
}
}
我的界面供参考:
好吧,从技术上讲,Repeater
控件将自行管理 ID,如果您尝试连接更多唯一 ID 以使其更加唯一,这将是已解决问题的开销。
看看你有没有像这样简单的Repeater
控件,里面有5个项目,我就用简化的Repeater
来解释一下:
<asp:Repeater runat="server" ID="MyRepeater">
<ItemTemplate>
<div runat="server" draggable="true" id="mySampleDiv"></div>
</ItemTemplate>
</asp:Repeater>
然后,它会这样管理div,html就是这样:
<div draggable="true" id="MyRepeater_mySampleDiv_0"></div>
<div draggable="true" id="MyRepeater_mySampleDiv_1"></div>
<div draggable="true" id="MyRepeater_mySampleDiv_2"></div>
<div draggable="true" id="MyRepeater_mySampleDiv_3"></div>
<div draggable="true" id="MyRepeater_mySampleDiv_4"></div>
在每个runat="server"
div的id
属性中,它有id的三部分使其唯一,
- Parent的ID
- 控件的 ID
- 和项目索引
这意味着,您正在努力连接 ID 的这个问题将是一项开销,因为它始终是唯一的。现在,如果我们使用 data-
属性,从 jquery/javascript 中的元素获取船员 ID 的问题就很容易了,因为我认为这个信息不是那么敏感。
做这样的事情:
<asp:Repeater runat="server" ID="MyRepeater">
<ItemTemplate>
<div runat="server" draggable="true" id="mySampleDiv" class="mydiv" data-crewid='<%# Eval("CrewId") %>'></div>
</ItemTemplate>
</asp:Repeater>
而使用 data-crewid
属性生成的 html 将是这样的:
<div draggable="true" id="MyRepeater_mySampleDiv_0" data-crewid="1000"></div>
<div draggable="true" id="MyRepeater_mySampleDiv_1" data-crewid="1001"></div>
<div draggable="true" id="MyRepeater_mySampleDiv_2" data-crewid="1002"></div>
<div draggable="true" id="MyRepeater_mySampleDiv_3" data-crewid="1003"></div>
<div draggable="true" id="MyRepeater_mySampleDiv_4" data-crewid="1004"></div>
这样,您就不需要管理元素的 ID,因为您主要关心的是在拖放特定元素时获取 crewid
。
而在jquery中,你可以这样得到:
<script>
$(document).ready(function(){
$('.mydiv').on('dragstart', function(){
var crewId = $(this).attr('data-crewid');
// do something with the crewId
});
});
</script>
注意,我用 class 而不是 ID 绑定了事件,然后从 data-
属性中取回 crewid。
到目前为止,显然 div 的 ID 对我来说并不重要,因为我只需要 crewid (您的情况可能有所不同) 或正在设置的任何 id,因此,我将 id 存储在 data-
属性中,而不是连接然后拆分 id 以获得 crewid。哪个可以很好地存储您拥有的 ID。
阅读此内容以了解有关 data-
属性的详细信息:https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes
更新
如果您想从 jquery 中的中继器获取项目索引,您还可以将其保存在另一个 data-
属性中,如下所示:
data-itemindex='<%# Container.ItemIndex %>'
我正在创建一个拖放式日程界面。用户可以将项目从右侧的选项卡列表拖到他们的日程表中。我使用中继器从 SQL 服务器加载工作人员。我目前正在使用大量 EVAL 来设置元素 ID。我想知道这是否是一种好的做法,或者是否有更好的方法来设置 ID?
我开发的下一步是由工作人员将 table 中的计划项目加载到每天,但我想在继续之前设置和理解 ID。之后,我将尝试在成功放置事件时触发 INSERT INTO 或 UPDATE(示例:UPDATE scheduleItems SET content = card text WHERE CrewID = xx AND date = xx)。这就是为什么我认为我的 ID 需要按顺序排列。
我是 ASP.NET Web 表单开发的新手,所以如果我的方法有偏差,请告诉我!
这是我的船员中继器:
<asp:Repeater ID="CrewRepeater" runat="server">
<ItemTemplate>
<div id="Crew<%# string.Format("{0}", Eval("CrewID"))%>" class="row">
<div class="board-layout">
<div class="left">
<div class="board-text">
Crew ID: <%# string.Format("{0}", Eval("CrewID"))%>
<div id='CrewList<%# string.Format("{0}", Eval("CrewID"))%>' class="crew-board-list">
<div id='Crew<%# string.Format("{0}", Eval("CrewID"))%>Employees' class="cardEmployee" data-toggle="modal" data-target="#DetailsModal" ondrop="dropIt(event)" ondragover="allowDrop(event)">
<p><%# string.Format("{0}", Eval("Members"))%></p>
</div>
<div id='Crew<%# string.Format("{0}", Eval("CrewID"))%>Equipment' class="cardEquipment">
<p><%# string.Format("{0}", Eval("Vehicles"))%></p>
</div>
</div>
</div>
</div>
<div id="BoardList<%# string.Format("{0}", Eval("CrewID"))%>" class="board-lists">
<div id="Sun<%# string.Format("{0}", Eval("CrewID"))%>" class="board-list" ondrop="dropIt(event)" ondragover="allowDrop(event)">
<%-- load schedule items here --%>
</div>
<div id="Mon<%# string.Format("{0}", Eval("CrewID"))%>" class="board-list" ondrop="dropIt(event)" ondragover="allowDrop(event)">
<%-- load schedule items here --%>
</div>
<div id="Tue<%# string.Format("{0}", Eval("CrewID"))%>" class="board-list" ondrop="dropIt(event)" ondragover="allowDrop(event)">
<%-- load schedule items here --%>
</div>
<div id="Wed<%# string.Format("{0}", Eval("CrewID"))%>" class="board-list" ondrop="dropIt(event)" ondragover="allowDrop(event)">
<%-- load schedule items here --%>
</div>
<div id="Thu<%# string.Format("{0}", Eval("CrewID"))%>" class="board-list" ondrop="dropIt(event)" ondragover="allowDrop(event)">
<%-- load schedule items here --%>
</div>
<div id="Fri<%# string.Format("{0}", Eval("CrewID"))%>" class="board-list" ondrop="dropIt(event)" ondragover="allowDrop(event)">
<%-- load schedule items here --%>
</div>
<div id="Sat<%# string.Format("{0}", Eval("CrewID"))%>" class="board-list" ondrop="dropIt(event)" ondragover="allowDrop(event)">
<%-- load schedule items here --%>
</div>
</div>
</div>
</div>
</ItemTemplate>
</asp:Repeater>
我的工作列表转发器:
<asp:Repeater ID="JobRepeater" runat="server">
<ItemTemplate>
<div id='cardJob<%# string.Format("{0}", Eval("Job"))%>' class="card" draggable="true" ondragstart="dragStart(event)">
<%--<asp:Label ID='lblJob' runat="server" Text='<%# string.Format("{0}", Eval("Job")) + " - " + string.Format("{0}", Eval("Description"))%>' />--%>
<p><%# string.Format("{0}", Eval("Job")) + " - " + string.Format("{0}", Eval("Description"))%></p>
</div>
</ItemTemplate>
</asp:Repeater>
我的拖拽JavaScript:
function allowDrop(ev) {
ev.preventDefault();
}
function dragStart(ev) {
ev.dataTransfer.setData("text", ev.target.id);
}
function dropIt(ev) {
ev.preventDefault();
let sourceId = ev.dataTransfer.getData("text");
let sourceIdEl = document.getElementById(sourceId);
let sourceIdParentEl = sourceIdEl.parentElement;
let targetEl = document.getElementById(ev.target.id)
let targetParentEl = targetEl.parentElement;
if (targetParentEl.id !== sourceIdParentEl.id) {
if (targetEl.className === sourceIdEl.className) {
targetParentEl.appendChild(sourceIdEl);
} else {
targetEl.appendChild(sourceIdEl);
}
} else {
let holder = targetEl;
let holderText = holder.textContent;
targetEl.textContent = sourceIdEl.textContent;
sourceIdEl.textContent = holderText;
holderText = '';
}
}
我的界面供参考:
好吧,从技术上讲,Repeater
控件将自行管理 ID,如果您尝试连接更多唯一 ID 以使其更加唯一,这将是已解决问题的开销。
看看你有没有像这样简单的Repeater
控件,里面有5个项目,我就用简化的Repeater
来解释一下:
<asp:Repeater runat="server" ID="MyRepeater">
<ItemTemplate>
<div runat="server" draggable="true" id="mySampleDiv"></div>
</ItemTemplate>
</asp:Repeater>
然后,它会这样管理div,html就是这样:
<div draggable="true" id="MyRepeater_mySampleDiv_0"></div>
<div draggable="true" id="MyRepeater_mySampleDiv_1"></div>
<div draggable="true" id="MyRepeater_mySampleDiv_2"></div>
<div draggable="true" id="MyRepeater_mySampleDiv_3"></div>
<div draggable="true" id="MyRepeater_mySampleDiv_4"></div>
在每个runat="server"
div的id
属性中,它有id的三部分使其唯一,
- Parent的ID
- 控件的 ID
- 和项目索引
这意味着,您正在努力连接 ID 的这个问题将是一项开销,因为它始终是唯一的。现在,如果我们使用 data-
属性,从 jquery/javascript 中的元素获取船员 ID 的问题就很容易了,因为我认为这个信息不是那么敏感。
做这样的事情:
<asp:Repeater runat="server" ID="MyRepeater">
<ItemTemplate>
<div runat="server" draggable="true" id="mySampleDiv" class="mydiv" data-crewid='<%# Eval("CrewId") %>'></div>
</ItemTemplate>
</asp:Repeater>
而使用 data-crewid
属性生成的 html 将是这样的:
<div draggable="true" id="MyRepeater_mySampleDiv_0" data-crewid="1000"></div>
<div draggable="true" id="MyRepeater_mySampleDiv_1" data-crewid="1001"></div>
<div draggable="true" id="MyRepeater_mySampleDiv_2" data-crewid="1002"></div>
<div draggable="true" id="MyRepeater_mySampleDiv_3" data-crewid="1003"></div>
<div draggable="true" id="MyRepeater_mySampleDiv_4" data-crewid="1004"></div>
这样,您就不需要管理元素的 ID,因为您主要关心的是在拖放特定元素时获取 crewid
。
而在jquery中,你可以这样得到:
<script>
$(document).ready(function(){
$('.mydiv').on('dragstart', function(){
var crewId = $(this).attr('data-crewid');
// do something with the crewId
});
});
</script>
注意,我用 class 而不是 ID 绑定了事件,然后从 data-
属性中取回 crewid。
到目前为止,显然 div 的 ID 对我来说并不重要,因为我只需要 crewid (您的情况可能有所不同) 或正在设置的任何 id,因此,我将 id 存储在 data-
属性中,而不是连接然后拆分 id 以获得 crewid。哪个可以很好地存储您拥有的 ID。
阅读此内容以了解有关 data-
属性的详细信息:https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes
更新
如果您想从 jquery 中的中继器获取项目索引,您还可以将其保存在另一个 data-
属性中,如下所示:
data-itemindex='<%# Container.ItemIndex %>'