2009-01-25 18 views
1

我的问题很简单,但我不能找到一种方法来解决它:(如何设置控制值在另一个打开的aspx页面

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

总之,输入字段需要从打开的页面接收字符串值我已经尝试了window.opener.getElementById(),但ASP.NET使用控件的Id's,所以我不能确定i的正确ID在运行时输入字段。

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

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

回答

0

也许不是在新窗口中打开单独的页面,而应该在当前窗口中显示一个元素,并使用AJAX控件确保页面的相关部分全部更新。看看ASP.NET AJAX PopUp扩展器,当然还有UpdatePanel。

0

为什么控件ID会改变?你在使用母版吗?如果是这样,您可以在运行时获取控件ID,虽然它们与您命名的控件ID不同,但它们始终具有相同的值。

这是最好的解决方案。

0

您可以在第二个.aspx页面(可以是弹出窗口)上使用Server.Transfer将查询字符串和表单变量返回到第一个.aspx页面。

Server.Transfer("firstPage.aspx", true) 

然后在第一页上,获取你想要这样的控件的值:

string x = Request.Form["SomeTextbox"].ToString(); 
0

是的,我使用的母版页,这就是为什么IDS改变。
我相信我找到了解决方案。我使用控件类属性,而不是id或name,因为类总是相同的。然后,我使用类名来获取id并将其传递给querystring到新页面。然后,新页面从querystring和getElementById中获取id以获取控制对象。通过该对象,可以将其值设置为所需的值。
这不是最简单的解决方案,但为我工作。感谢您的回复。我受够了!

0

我用下面的方法来实现类似的结果对你的:

在主要页面,我检查,看看是否浏览器可以显示一个模态窗口(基本上,互联网浏览器),如果是这样,流行新的窗口模式 - 这使我返回值直接返回给调用方法,否则我只是弹出一个新窗口,并希望:

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以更好地控制生成Ids的方式。

2

如果你使用类似jquery,其中,顺便说一句,强烈建议而不是使用基本的DOM功能,你可以试试这个:

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

,应做到以下几点:

  • window.opener.$如果从开启器窗口查询功能
  • (“[id $ = something]”)是一个选择器,选择具有以“txtValue”结尾的“id”属性的所有元素(这是什么让你成功nd丑陋的身份证问题)。
  • .val(“some value”)将该输入字段的值设置为“某个值”。

我不推荐在javascript代码中对asp.net标识进行硬编码。该ID将始终由于某种原因在未来的某个时间点发生变化,您的页面将会中断。更不用说它的丑陋:)

另外,虽然window.opener解决方案有其不利之处,但在服务器端执行此操作通常会导致更糟糕的情况,例如使用Session在页面之间传递数据或竞争条件哪个页面(父母或孩子)首先回发。

相关问题