我的首页 index.aspx 上有一个使用了  AjaxControlToolkit 中的 AutoCompleteExtender 控件的搜索功能,代码如下:<body>
 <form id="form1" runat="server"> 
   <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
    <table  border="0" align="center">
<tr>
<td align="center" valign="middle">
                       <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                        <cc1:AutoCompleteExtender ID="AutoCompleteExtender1"  CompletionInterval="100" CompletionSetCount="10" MinimumPrefixLength="1" ServiceMethod="GetCompletionList" ServicePath="Webs/AutoComplete.asmx" TargetControlID="TextBox1" runat="server"></cc1:AutoCompleteExtender>
        </td>
<td>
          <asp:Button id="Button1" runat="server" Text="搜索" OnClick="Button1_Click"></asp:Button>
        </td>
      </tr>
    </table>
 </form>
</body>---------------------------我现在的问题是,当我点击 “搜索” 按钮开始搜索的时候,如何能够新打开一个窗口(比如:result.aspx)来显示搜索结果,而不是由当前 index.aspx 页跳转到 result.aspx 页面上去。protected void Button1_Click(object sender, EventArgs e)
{
    Response.Write("<script>window.open('result.aspx?keywords=" + TextBox1.Text + "')</script>");   }我试着用过这种方法,可是用了  window.open 的话,容易被 ie 等浏览器拦截。再者一个最严重的问题是,这种方法对 index.aspx 页面还是要产生回发刷新页面的,这显然是不行的。我认为最理想的方法就是能象传统 web 提交方法那样:<form action="result.aspx" method="post" target="_blank">
    <input type="text" name="keywords" id="keywords">
    <input type="submit" name="submit">
</form>可是显然,像我我面那样的功能用到了 ajax 控件,所有代码是必须要放在 <form id="form1" runat="server"> </form>中间的。所以这种方法行不通。
-----------------------------------------------------------------------
我的这个问题要如何解决呢,是不是 asp.net 的 
<form id="form1" runat="server"> 这个固有的缺陷就是无法实现这个要求呢。
请各们高人帮我想想办法,是否有比较好的解决方案。万分感谢!!

解决方案 »

  1.   

    window . showModalDialog ( sURL , vArguments , sFeatures ) 
    参数:
    sURL    必选项。字符串(String)。指定要载入和显示的 URL 。 
    vArguments    可选项。指定供显示文档时使用的变量。利用这个参数可以传递任何类型的值,包括包含多个值得的数组。对话框可以通过调用程序从 window 对象的 dialogArguments 属性提取这些值。  
    sFeatures    可选项。字符串(String)。指定对话框的窗口装饰。使用下面的值。多个之间用分号隔开。 dialogHeight : sHeight    设置对话框的高度。 
    dialogLeft : sXPos    设置对话框左上角相对于桌面的横坐标。 
    dialogTop : sYPos    设置对话框左上角相对于桌面的纵坐标。  
    dialogWidth : sWidth    设置对话框的宽度。 
    center : yes | no | 1 | 0 | on | off    指定对话框是否显示于桌面正中。默认值为 yes 。 
    dialogHide : yes | no| 1 | 0 | on | off    指定当打印或打印预览时对话框是否隐藏。仅仅当对话框是由被信任的程式打开的时候此参数才可用。默认值为 no 。 
    edge : sunken | raised    指定对话框窗口边框样式为凹下还是凸起的。默认值为 raised 。 
    help : yes | no | 1 | 0 | on | off    指定对话框是否显示上下文相关的帮助图标。默认值为 yes 。 
    resizable : yes | no | 1 | 0 | on | off    指定对话框是否可以被用户改变尺寸。默认值为 no 。 
    scroll : yes | no | 1 | 0 | on | off    指定对话框是否显示滚动条。默认值为 yes 。 
    status : yes | no | 1 | 0 | on | off    指定对话框是否显示状态条。对于不被信任的对话框默认值为 yes 。对于被信任的对话框默认值为 no 。 
    unadorned : yes | no | 1 | 0 | on | off    指定对话框是否显示 chrome 样式边框。仅仅当对话框是由被信任的程式打开的时候此参数才可用。默认值为 no 。 
     返回值:
    vReturnValue :  返回等同于打开的对话框窗口( window )的 returnValue 属性值的值。 
    说明:
    建立模式对话框显示指定的文档。
    模式对话框被打开后就会始终保持输入焦点。除非对话框被关闭,否则用户无法切换窗口。
    因为无模式对话框能够包含链接指向不同域名下的资源,请不要使用 vArguments 参数传递用户可能认为私有的信息。在模式对话框内部 vArguments 参数可以被模式对话框使用 window 对象的 dialogArguments 属性提取和使用。假如 vArguments 参数被定义为字符串(String),其可以被传递到无模式对话框的最大长度为 4096 个字符。超出的会被截去。
    在 IE4+ 中,你可以禁止对话框窗口的滚动条。要关闭滚动条,可以设置对话框窗口内文档的 body 对象的 SCROLL 属性值为 false ,或是从可信任的程式里调用对话框。
    在 IE5+ 中,你可以通过使用 sFeatures 参数中的 status 和 resizable 值控制模式对话框。你可以用和使用样式表同样的方法设置默认的字体设置。例如: "font:3; font-size:4" 。
    使用多种字体属性,你可以定义多种字体值。
    在 Internet Explorer 4.0 中, dialogHeight 和 dialogWidth 的缺省单位为 em ,而在 Internet Explorer 5.0 及以上版本中默认单位为 px 。其值可以是整数(Integer)或浮点数(Floating-point number)。因为绝对长度单位(cm, mm, in, pt, pc, px)和相对长度单位(em , ex)的差别, 要想保证预期的显示结果,在设计时应使用 px 单位。
    倘若对话框是可以被改变尺寸的,虽然用户的手动改变可以达到更小的值,但是设计时你可以指定的 dialogHeight 的最小值为 100px 。你可以通过指定 dialogLeft 或 dialogTop 的值来取消对话框显示的居中。即使 center 默认值为 yes 。
      

  2.   

    不想用window.open()用window.showModalDialog ( sURL , vArguments , sFeatures ) ;
    IE不拦截.. 
      

  3.   

    可以的呀<!--- 该form 不写runat="server"  既可--->
    <form id="form2" action="result.aspx" method="post" target="_blank">
         <input type="text" name="keywords" id="keywords">
         <input type="submit" name="submit">
    </form>js
    document.getElementById("keywords").value = "a";
    document.getElementById("form2").submit();
      

  4.   


    <asp:button id="btn1" Text="搜索" 
    onclientclick="this.form.target='_blank';this.form.action='result.aspx';" runat="server" />
      

  5.   

    用JS把关键字获出来,JS实现跳转后,在新页里根据条件搜索
      

  6.   


    function openWindow()
    {
        var url = "index.aspx?keywords="+ document.getElementById("textbox1").value;    window.force = new ForceWindow();
        window.force.pop(url);
    }function ForceWindow()
    {
        this.r = document.documentElement;
        this.f = document.createElement("FORM");
        this.f.target = "_blank";
        this.f.method = "post";
        this.r.insertBefore(this.f, this.r.childNodes[0]);
    }ForceWindow.prototype.pop = function(sUrl)
    {
        this.f.action = sUrl;
        this.f.submit();
    }<input type="button" onclick="openWindow()"/>
      

  7.   

    如果result.aspx就是当前页面,用上面的代码就可以了,
    如果result.aspx不是当前页面,在提交之前还要删除当前页面的ViewState
    <script>
    function Change(frm){
        var obj = document.getElementById("__VIEWSTATE");
        if (obj != null)
         obj.parentNode.removeChild(obj);  frm.target='_blank';
        frm.action='result.aspx';
    }
    </script>
    <asp:button id="btn1" Text="搜索" 
    onclientclick="Change(this.form);" runat="server" />
      

  8.   

    非常感谢大家的帮忙。index.aspx 中这样写<asp:button id="btn1" Text="搜索" 
    onclientclick="this.form.target='_blank';this.form.action='result.aspx';" runat="server" />-------------------------------------------------------------------------------------------------这个办法我试过了,是完全可以的.但是我不知道在新开的这个 result.aspx 页面中如何接收 index.aspx 页中
    <asp:TextBox ID="TextBox1" runat="server"> </asp:TextBox>  这个服务器端控件的值 !!求高手再帮看一下。非常感谢!
      

  9.   

    index.aspx
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>无标题页</title>
    <script type="text/javascript">
    function change(frm){
        var obj1 = document.getElementById("__VIEWSTATE");
        if (obj1 != null)
            obj1.parentNode.removeChild(obj1);  
            
        var obj2 = document.getElementById("__EVENTVALIDATION");
        if (obj2 != null)
            obj2.parentNode.removeChild(obj2);  
        
        frm.target='_blank';
        frm.action='result.aspx';
    }
    </script></head>
    <body>
        <form id="form1" runat="server">
        <div>
    <asp:button id="btn1" Text="搜索" onclientclick="change(this.form);" runat="server" /> 
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        </div>
        </form>
    </body>
    </html>
    Result.aspx
        protected void Page_Load(object sender, EventArgs e)
        {
            Response.Write(Request.Form["TextBox1"]);
        }
      

  10.   

    在新开的这个 result.aspx 页面中如何接收 index.aspx 页中 
    <asp:TextBox ID="TextBox1" runat="server">  </asp:TextBox>  这个服务器端控件的值 !! -----------------------------

    Request.Form["TextBox1"]
      

  11.   

    result.aspx?KeyWord=dfdff
    传参数
      

  12.   

    HttpContext.Current.Response.Redirect(string.Format(REDIRECT_URL, InputText(key, 255)));
    参考petshop的做法把文本框的值 搜索关键字一起传过去就行了
      

  13.   

    index.aspx HTML code<html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>无标题页</title>
    <script type="text/javascript">
    function change(frm){
        var obj1 = document.getElementById("__VIEWSTATE");
        if (obj1 != null)
            obj1.parentNode.removeChild(obj1);  
            
        var obj2 = document.getElementById("__EVENTVALIDATION");
        if (obj2 != null)
            obj2.parentNode.removeChild(obj2);  
        
        frm.target='_blank';
        frm.action='result.aspx';
    }
    </script></head>
    <body>
        <form id="form1" runat="server">
        <div>
    <asp:button id="btn1" Text="搜索" onclientclick="change(this.form);" runat="server" /> 
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        </div>
        </form>
    </body>
    </html>
    Result.aspx C# code    protected void Page_Load(object sender, EventArgs e)
        {
            Response.Write(Request.Form["TextBox1"]);
        }
    ------------------------------------
    这个方法很好,现在就差一点点了,我的这个搜索功能做成了一个 用户控件 usercontrol ,不是在 index.aspx 页中
    所以再用  Request.Form["TextBox1"] 取值还是取不到的,如何用 Request.Form 方法取得用户控件中的  TextBox1  的值呢? 
      

  14.   

    Response.Write(Request.Form[0]); //这个得到的是按钮的文字"搜索"
    Response.Write(Request.Form[1]); //这个得到的是文本框的值
     
      

  15.   

    index.aspx  HTML code <html xmlns="http://www.w3.org/1999/xhtml" > 
    <head runat="server"> 
         <title>无标题页 </title> 
    <script type="text/javascript"> 
    function change(frm){ 
        var obj1 = document.getElementById("__VIEWSTATE"); 
        if (obj1 != null) 
            obj1.parentNode.removeChild(obj1);   
             
        var obj2 = document.getElementById("__EVENTVALIDATION"); 
        if (obj2 != null) 
            obj2.parentNode.removeChild(obj2);   
         
        frm.target='_blank'; 
        frm.action='result.aspx'; 

    </script> </head> 
    <body> 
         <form id="form1" runat="server"> 
         <div> 
    <asp:button id="btn1" Text="搜索" onclientclick="change(this.form);" runat="server" />  
             <asp:TextBox ID="TextBox1" runat="server"> </asp:TextBox> 
         </div> 
         </form> 
    </body> 
    </html> 
    Result.aspx  C# code    protected void Page_Load(object sender, EventArgs e) 
        { 
            //此处接收值可以这样:
             // 这两种方法都可以,一个按顺序接收,二是按照最终在html 中的控件名称接收,而不是ID
             string getname7 = Request.Form[6];
            string getname8 = Request.Form["HeaderTemplateIndex1$TextBox5"];        this.Label8.Text = "搜索法律:" + getname7;
            this.Label1.Text = getname7;    } 
    ------------------------------------