在Javascript中设置隐藏的输入值,然后在后面的代码中访问它

时间:2010-04-21 22:29:56

标签: c# asp.net javascript html

我一直在尝试使用Javascript设置隐藏输入的值,然后从我的C#代码隐藏中访问该值。当我运行下面复制的代码时,分配给assignedID的值是“”,我假设它是隐藏输入的默认值。如果我在html标记中手动设置值,则assignIDs设置为该值。

这个行为告诉我,在onClientClick和onClick事件触发之间输入的值被重置(重新渲染?)。

我很感激任何有关此事的帮助。我花了好几个小时试图解决看似非常简单的问题。

HTML / JavaScript的:

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Admin Page - Manage Tasks</title>
    <script language="javascript" type="text/javascript">
        function PopulateAssignedIDHiddenInput() {
            var source = document.getElementById('assignedLinguistListBox');
            var s = "";
            var count = source.length;
            for (var i = count - 1; i >= 0; i--) {
                var item = source.options[i];
                if (s == "") { s = source.options[i].value; }
                else { s = s.concat(",",source.options[i].value); }
            }
            document.getElementById('assignedIDHiddenInput').Value = s;
            // I have confirmed that, at this point, the value of
            // the hidden input is set properly
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Panel id="EditMode" runat="server">
            <table style="border: none;">
                <tr>
                    <td>
                        <asp:Label ID="availableLinguistLabel" runat="server" Text="Available"></asp:Label><br />
                        <asp:ListBox ID="availableLinguistListBox" runat="server" Rows="10" SelectionMode="Multiple"></asp:ListBox>
                    </td>
                    <td>
                        <input type="button" name="right" value="&gt;&gt;"
                            onclick="Javascript:MoveItem('availableLinguistListBox', 'assignedLinguistListBox');" /><br /><br />
                        <input type="button" name="left" value="&lt;&lt;"
                            onclick="Javascript:MoveItem('assignedLinguistListBox', 'availableLinguistListBox');" />
                    </td>
                    <td>
                        <asp:Label ID="assignedLinguistLabel" runat="server" Text="Assigned To"></asp:Label><br />
                        <asp:ListBox ID="assignedLinguistListBox" runat="server" Rows="10" SelectionMode="Multiple"></asp:ListBox>
                    </td>
                </tr>
            </table>
            //-snip-
            <asp:Button ID="save_task_changes_button" runat="server" ToolTip="Click to save changes to task"
                Text="Save Changes" OnClick="save_task_changes_button_click" OnClientClick="Javascript:PopulateAssignedIDHiddenInput()" />
        </asp:Panel>

        <!-- Hidden Inputs -->
        <!-- Note that I have also tried setting runat="server" with no change -->
        <input id="assignedIDHiddenInput" name="assignedIDHiddenInput" type="hidden" />
    </div>
    </form>
</body>

C#

protected void save_task_changes_button_click(object sender, EventArgs e)
{
    string assignedIDs = Request.Form["assignedIDHiddenInput"];
    // Here, assignedIDs == ""; also, Request.Params["assignedIDHiddenInput"] == ""
    // -snip-
}

3 个答案:

答案 0 :(得分:7)

在javascript中,您需要value属性为小写,如下所示:

document.getElementById('assignedIDHiddenInput').value = s;

然后将正确设置:) You can see an example in action here

虽然如果您提醒.Value它会显示您的价值,但您实际上已添加 .Value属性,但您尚未设置输入{{1} 1}}属性是发布到服务器的属性。上面的示例链接说明了这两种方式。

此外,你可以使它更快一点,特别是如果你有很多选项,使用数组而不是字符串连接,如下所示:

.value

修改:上面的代码已更新,CMS正确,前一个方法取决于浏览器,上面的代码现在应该始终如一。此外,如果jQuery是一个选项,则有更短的方式来获取此信息,如下所示:

var source = document.getElementById('assignedLinguistListBox');
var opts = [];
for (var i = 0; i < source.options.length; i++) {
    opts.push(source.options[i].value);
}
var s = opts.join(',');

You can see a working example of this here

答案 1 :(得分:1)

我在这里假设ASP.NET。

如果是这样,您的问题是ASP.NET生成的HTML中的控件的id不会是您在脚本中引用的“assignedIDHiddenInput”。 ASP.NET会在声明性地从HTML页面中指定的HTML呈现HTML之前更改这些内容。在页面上做一个视图源,你会看到我的意思。

以下是解决这个问题的方法:

document.getElementById('<%=assignedIDHiddenInput.ClientID %>').value = s;

更新:如评论中所述,仅当控件设置为RunAt = Server时才会相关。

答案 2 :(得分:0)

我认为ASP.NET在调用你的javascript函数来填充该隐藏值之前调用javascript来对该控件执行回发。

我认为可以禁用默认回发并自行处理,但我相信其他人可以提供更好的建议。

将警报()粘贴到你的函数中,看看它是否真的被调用,然后才会触发回传。