我的问题很简单,但我找不到解决方法:(
当用户点击特定按钮时,我需要打开一个新的aspx页面(在新窗口中),以便他能够选择需要返回到原始页面的内容。 我可以用window.open打开新页面,但是,我无法在原始页面中重新设置所选值。
总之,输入字段需要从打开的页面接收字符串值。我已尝试使用window.opener.getElementById()
,但ASP.NET使用控件的Id进行混乱,因此我无法在运行时确定输入字段的正确ID。
是否有更简单的方法只使用服务器端代码(打开页面并返回值),而不是使用JavaScript和window.opener(在我看来这是非常糟糕的)?
如果没有,也欢迎任何其他简单的解决方案!
答案 0 :(得分:2)
如果使用jquery这样的东西,强烈建议使用它而不是使用基本的DOM函数,你可以试试这个:
window.opener.$("[id$=txtValue]").val(valueToSet);
应执行以下操作:
window.opener.$
如果查询函数来自开启窗口我不建议在javascript代码中对asp.net ID进行硬编码。由于某种原因,该ID将总是在将来某个时候发生变化,您的页面将会中断。更不用说它很难看:))
此外,虽然window.opener解决方案有其缺点,但在服务器端执行此操作通常会导致更糟糕的事情,例如使用Session在页面之间传递数据或在哪个页面之间传递数据(父级或子级) )首先回发。
答案 1 :(得分:0)
也许不是在新窗口中打开一个单独的页面,而是应该在当前窗口中显示一个元素,并使用AJAX控件来确保页面的相关部分都已更新。看一下ASP.NET AJAX PopUp扩展器,当然还有UpdatePanel。
答案 2 :(得分:0)
为什么控制ID会发生变化?你在使用母版页吗?如果是这样,您可以在运行时获取控件ID,尽管它们与您命名的控件ID不同,但它们将始终具有相同的值。
这是最好的解决方案。
答案 3 :(得分:0)
您可以在第二个.aspx页面(可以是弹出窗口)上使用Server.Transfer
将查询字符串和表单变量返回到第一个.aspx页面。
Server.Transfer("firstPage.aspx", true)
然后在第一页上,检索您想要的控件的值:
string x = Request.Form["SomeTextbox"].ToString();
答案 4 :(得分:0)
是的,我正在使用母版页,这就是ids改变的原因 我相信我找到了解决方案。我使用的是控件类属性,而不是id或name,因为类总是相同的。然后,我使用类名来获取id并将其在查询字符串中传递给新页面。然后,新页面从查询字符串和getElementById获取id以获取控制对象。使用该对象,可以将其值设置为所需的值 这不是最简单的解决方案,但对我有用。谢谢你的回复。我做完了!
答案 5 :(得分:0)
我使用以下方法来获得与您类似的结果:
在主页面中,我检查浏览器是否可以显示模态窗口(基本上是Internet Explorer),如果是,则将新窗口弹出为模态 - 这使我能够直接将值返回给调用方法,否则我只是弹出一个新窗口并希望:
if (window.showModalDialog)
{
// showModalDialog returns a result, so pass that into the receiving function
// directly.
CallbackFunctionName(ShowModal(displayPath));
}
else
{
// Just use the standard window.open methods.
ShowWindow(displayPath);
}
function ShowWindow(displayPath)
{
var remoteWin=window.open(displayPath,"EditContact",
"resizable=yes,toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=yes,copyhistory=0,modal=yes,width="
+ dialogWidth + ",height=" + dialogHeight);
remoteWin.creator=self;
remoteWin.focus();
}
function ShowModal(displayPath)
{
return window.showModalDialog(displayPath, "editContact",
"center:yes;resizable:no;dialogWidth:" + dialogWidth +
"px;dialogHeight:" + dialogHeight + "px;");
}
然后,在打开的页面上,我再次检查是否能够像以前一样显示模态窗口:
if(!window.showModalDialog)
{
// Call the callback method directly
window.opener.CallBackFunctionName(resultValue);
}
else
{
// Return the value back to the caller, who will pass the result along.
window.returnValue=resultValue;
}
self.close();
ASP.NET仅以已知的方式使用控件ID混乱 - 一旦服务器上的运行时加载了控件,您就可以检索将包含控件的运行时ID的ClientID
- 您可以将此值写入JS变量,或使用一些JS根据控件的其他功能获取控件值。
另请注意,从ASP.NET框架的第4版开始,您可以设置控件ClientIdMode
以更好地控制ID的生成方式。