[英]Moving items from one ListBox to another and getting items in ListBox
我有一个ASP.NET向导控件。 第二步,我有两个ListBoxes。 页面加载时,将从服务器填充第一个ListBox项。
然后,用户从ListBox1中选择数据并将其移动到ListBox2。 然后,用户单击向导的NEXT按钮。 用户以某种方式单击下一步时,ListBox2为空。
我使用jQuery将数据从ListBox1移动到ListBox2。
<td class="style9">
<asp:ListBox ID="registerCompCats" runat="server" CssClass="ListBox1"
ClientIDMode="Static" DataTextField="value" DataValueField="key"
Rows="5" size="5" style="width:135px; size:5px;" SelectionMode="Multiple" ></asp:ListBox>
</td>
<td class="style1">
<table>
<tr>
<td style="padding-left: 20px;">
<img id="addCat" onclick="return addCat_onclick()"
src="images/buttons/btn_addCat.jpg" title="Add Category" />
</td>
</tr>
<tr>
<td style="padding-left: 20px;">
<img id="removeCat"
src="images/buttons/btn_removeCat.jpg" title="Remove Category" />
</td>
</tr>
</table>
</td>
<td>
<asp:ListBox ID="registerCompAcats" runat="server" CssClass="ListBox2"
ClientIDMode="Static" DataTextField="value" DataValueField="key"
Rows="5" size="5" style="width:135px; size:5px; margin-top: 0px;" SelectionMode="Multiple" ></asp:ListBox>
<asp:RequiredFieldValidator ID="registerCompAcatsValidator" runat="server"
ControlToValidate="registerCompAcats" Display="None" ErrorMessage="categories"></asp:RequiredFieldValidator></td>
如果您搞砸了列表框和/或在客户端下拉列表的可用选项(即使用jQuery或其他方式),则内置的ASP .NET表单验证(称为“事件验证”)将启动并抛出一个例外,因为您提交的表单选项与表单最初呈现控件时所提供的选项不同。 若要解决此问题,您必须在.aspx页的顶部执行此操作:
<%@ Page EnableEventValidation="false" %>
请记住,如果执行此操作,则需要自己对下拉列表和列表框执行表单验证。
每次将页面发布回服务器时,这些控件都有0个选择。 是的,您会在HTML中看到这些选择,但是在服务器上,它们的选择为0。 如果在这些控件上启用了viewstate,则ASP .NET框架将在页面生命周期内自动添加上一页呈现中的选择。 这意味着,由于registerCompAcats
控件在第一页呈现中没有选择,因此将页面发布回服务器时,它仍然没有任何选择。
这些asp:ListBox
控件在HTML中呈现为<select>
元素。 这些工作方式是它们仅将在这些列表框中选择的值发布到服务器。 这意味着无论选择什么,您都只会知道用户在表单发布的这些列表框中选择的项目。
有几种方法可以解决此问题。 我将概述几个。
这可能是最简单但效率最低的。 每次用户单击“添加类别”按钮时,都可能导致页面回发,而不是使用jQuery将项目从一个列表框移到另一个列表框。 这允许服务器端代码控制每个框中的选项,并且viewstate可以帮助您。 您也可以在页面上重新启用事件验证,通常这是个好主意。
<asp:ListBox id="lb1" runat="server" />
<asp:Button id="btnAdd" runat="server" />
<asp:ListBox id="lb2" runat="server" />
对于btnAdd.Click事件:
Sub btnAdd_Click(sender As Object, args As EventArgs) Handles btnAdd.Click
lb2.Items.AddRange(lb1.Items.Where(Function(i) i.Selected).ToArray())
End Sub
您需要关闭事件验证,就像我在上面解释的那样。 使用jQuery将项目从一个列表移动到另一个列表-很好。 但是,在实际在页面上引起回发之前,您将使用jQuery收集第二个列表框中的所有值,并将这些值放在runat="server"
的隐藏字段中。
<asp:ListBox id="lb1" runat="server" />
<input type="button" value="Add" onclick="addCategory();" />
<asp:ListBox id="lb2" runat="server" />
<input type="hidden" id="hdnSelectedCategories" runat="server" />
<asp:Button id="btnSubmit" runat="server" onclientclick="preSubmit();" />
jQuery部分:
<script type="text/javascript">
var lb1, lb2, hdnSelectedCategories;
$(function() {
lb1 = $('#<%=lb1.ClientID %>');
lb2 = $('#<%=lb2.ClientID %>');
hdnSelectedCategories = $('#<%=hdnSelectedCategories.ClientID %>');
});
function addCategory() {
lb2.append(lb1.find('option:selected'));
}
function preSubmit() {
// collect all the values from the lb2 listbox into an array
var values = [];
lb2.find('option').each(function(index, item) {
values.push($(item).val());
});
// now put the contents of the array in the hidden input, separated by commas
hdnSelectedCategories.val(values.join(','));
}
</script>
现在在您的代码后面,针对btnSubmit.Click事件:
Sub btnSubmit_Click(sender As Object, args As EventArgs) Handles btnSubmit.Click
Dim values As String() = hdnSelectedCategories.Value.Split(",")
'TODO: Profit'
End Sub
在这种方法中,您可能还需要关闭列表框上的Viewstate,因为这会给请求增加膨胀,并在用户单击“提交”按钮后重置列表框。
我对这种代码的测试非常少-只是我的头上。 但是希望有关事件验证,视图状态和回发页面生命周期的说明将帮助您了解实际情况,并可以提出适合您情况的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.