如何在另一个打开的aspx页面中设置控件值

时间:2009-01-25 20:20:39

标签: asp.net javascript

我的问题很简单,但我找不到解决方法:(

当用户点击特定按钮时,我需要打开一个新的aspx页面(在新窗口中),以便他能够选择需要返回到原始页面的内容。 我可以用window.open打开新页面,但是,我无法在原始页面中重新设置所选值。

总之,输入字段需要从打开的页面接收字符串值。我已尝试使用window.opener.getElementById(),但ASP.NET使用控件的Id进行混乱,因此我无法在运行时确定输入字段的正确ID。

是否有更简单的方法只使用服务器端代码(打开页面并返回值),而不是使用JavaScript和window.opener(在我看来这是非常糟糕的)?

如果没有,也欢迎任何其他简单的解决方案!

6 个答案:

答案 0 :(得分:2)

如果使用jquery这样的东西,强烈建议使用它而不是使用基本的DOM函数,你可以试试这个:

window.opener.$("[id$=txtValue]").val(valueToSet);

应执行以下操作:

  • window.opener.$如果查询函数来自开启窗口
  • (“[id $ = something]”)是一个选择器,它选择所有具有以“txtValue”结尾的“id”属性的元素(这可以解决丑陋的Id问题)。
  • .val(“some value”)将该输入字段的值设置为“某个值”。

我不建议在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的生成方式。