我一直在尝试使用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=">>"
onclick="Javascript:MoveItem('availableLinguistListBox', 'assignedLinguistListBox');" /><br /><br />
<input type="button" name="left" value="<<"
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-
}
答案 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(',');
答案 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来对该控件执行回发。
我认为可以禁用默认回发并自行处理,但我相信其他人可以提供更好的建议。
将警报()粘贴到你的函数中,看看它是否真的被调用,然后才会触发回传。