0

我有一个 asp:ListBox,它是根据另一个 asp:List 框的选定值从 js 动态填充的。问题是第二个列表框总是返回“”的 SelectedValue,无论我设置 lstBox.selectedIndex = 0 还是实际选择列表中的项目。

.js 添加到列表然后设置默认选定项

var Option = document.createElement("option");
lstId = document.getElementById(lstId);
Option.text = lstItem;
lstId.add(Option);    
lstId.selectedIndex = 0;

.vb 获取选定的值

Dim selSchedule As String = lstCRMSched.SelectedValue

现在,由于此列表由 javascript 填充,因此我必须设置我的 @page EnableEventValidation = "false" 否则稍后的回发将失败。

旁注:我注意到当您使用隐藏的 div 作为基于菜单选择不隐藏的覆盖时,asp.net 不喜欢它,因为它所做的一切都需要回发,这会消除其他 div 的状态。我是否应该为每个 div 设置一个 10 个 .aspx 文件,然后使用会话从代码隐藏中切换位置以传输要在另一个 div 中显示的选定值和数据等内容?

4

2 回答 2

2

您可以SelectedValue通过对象访问下拉列表的 ,Request因为表单中具有名称的每个元素都在请求中提交。

你只需要这样做:

Dim selSchedule As String = Request[lstCRMSched.UniqueID]

现在,这将起作用,因为您在页面上禁用了 EventValidation。你得到的错误是完全正常的。ASP.NET 只是确保没有人发送最初不是由服务器呈现的数据以防止攻击。如果要在页面上启用 EventValidation,则需要通过ClientScriptManager.RegisterForEventValidation注册验证列表

于 2012-08-31T19:56:54.857 回答
1

如果您将项目添加到客户端的下拉列表中,这些项目不会保留在服务器上

但是您可以尝试一些隐藏的输入字段中保存动态添加的项目(文本值对)并在服务器上解析它们。有关工作示例,请参阅此链接。对于您的示例,您还必须将selectedIndex保存另一个隐藏字段中,以便能够在服务器上访问它。

编辑

演示.aspx

<script type="text/javascript">
function saveValue() {
    var hiddenField1 = document.getElementById("hiddenField1");
    hiddenField1.value = "hello world";
}
</script>
<form id="Form1" method="post" runat="server">
    <input type="hidden" id="hiddenField1" name="hiddenField1" value="" />
    <asp:Button ID="btnPostBack" runat="server" Text="PostBack" 
        OnClientClick="saveValue()" onclick="btnPostBack_Click" />
</form>

演示.aspx.cs

protected void btnPostBack_Click(object sender, EventArgs e)
{
    Debug.WriteLine("Value of hiddenField1: " + Request["hiddenField1"]);
    Debugger.Break();
}

这个对我有用。我"hello world"上了服务器。

编辑 2

Icarus 指出,您始终可以通过引用 Request 对象来访问任何提交给服务器的元素,当然他是绝对正确的!根据您的问题,我认为您希望访问所有动态创建的项目- 即 - 使用下面显示的解决方案 -不可能

aspx页面

<script type="text/javascript">
    function saveToList() {
        var ListBox1 = document.getElementById("ListBox1");
        var ListBox2 = document.getElementById("ListBox2");
        var Option = document.createElement("option");
        Option.text = ListBox1.options[ListBox1.selectedIndex].text;
        ListBox2.add(Option);
        ListBox2.selectedIndex = 0;
    }
</script>
<form id="Form1" method="post" runat="server">
<asp:ListBox ID="ListBox1" runat="server">
    <asp:ListItem Text="entry1" Value="1" />
    <asp:ListItem Text="entry2" Value="2" />
    <asp:ListItem Text="entry3" Value="3" />
    <asp:ListItem Text="entry4" Value="4" />
</asp:ListBox>
<asp:ListBox ID="ListBox2" runat="server" Width="100"></asp:ListBox>
<input id="Button1" type="button" value="Save to List" onclick="saveToList()" />

<asp:Button ID="btnPostBack" runat="server" Text="PostBack" OnClick="btnPostBack_Click" />

代码隐藏

protected void btnPostBack_Click(object sender, EventArgs e)
{
    Debug.WriteLine("SelectedValue of ListBox2: " + Request["ListBox2"]);
    // no access to all other clientSide created items in ListBox2
    Debugger.Break();
}
于 2012-08-31T19:33:26.850 回答