我该怎么办<;form method=";获得&燃气轮机;在ASP.Net中查找搜索表单?

我该怎么办<;form method=";获得&燃气轮机;在ASP.Net中查找搜索表单?,asp.net,forms,methods,get,Asp.net,Forms,Methods,Get,我目前正在开发的一个应用程序中有一个搜索表单,我希望它相当于method=“GET” 因此,当点击搜索按钮时,用户进入search.aspx?q=the+query+he+entered 我之所以要这样做,是因为它可以作为书签,而且这样做感觉更干净 我也不希望将viewstate隐藏字段值附加到URL 我能想到的最好办法是: 捕获按钮的服务器端单击事件并响应。重定向 将Javascriptonclick处理程序附加到触发窗口的按钮。位置。替换 两者都感觉古怪和次优。。。 你能想出一个更好的方法吗

我目前正在开发的一个应用程序中有一个搜索表单,我希望它相当于
method=“GET”

因此,当点击搜索按钮时,用户进入
search.aspx?q=the+query+he+entered

我之所以要这样做,是因为它可以作为书签,而且这样做感觉更干净

我也不希望将viewstate隐藏字段值附加到URL

我能想到的最好办法是:

  • 捕获按钮的服务器端单击事件并
    响应。重定向
  • 将Javascript
    onclick
    处理程序附加到触发
    窗口的按钮。位置。替换
  • 两者都感觉古怪和次优。。。
    你能想出一个更好的方法吗?

    使用一个简单的旧html表单,而不是服务器端表单(runat=server),你应该能够让它工作

    但是,如果您有一个现成的VisualStudio母版页,它将整个页面包装在服务器端表单中,这可能是一个问题,因为您不能嵌套表单

    Web表单不必很糟糕,但默认实现通常会这样做。你不必事事都使用web表单。有时,普通的post/get和process request代码就可以了。

    我会选择(b),因为(a)一个查询需要两次往返。或者,您可以禁用页面上的viewstate,通过javascript删除任何其他隐藏字段,还可以使用javascript从post修改表单方法以获取。我从来没有真正这样做过,但是我的玩具页面使用了附带的示例,效果非常好。可以说,这比编码搜索字符串和通过javascript执行get更容易

    实际上,听上去使用ASP.NETMVC会更开心,因为在那里,只需将表单方法设置为进入视图,就可以轻松实现

    使用jquery的示例代码

     $(document).ready( function() {
         $('input[type=hidden]').remove();
         $('form').attr('method','get');
     });
    

    编辑:似乎您也应该能够在服务器端执行同样的操作。也许在OnPreRenderComplete中。现在无法访问Visual Studio进行检查。

    我一直使用Response.Redirect,因为它“有效”


    我认为没有最佳的方法。

    我在一个网站上工作,该网站必须发布到第三方网站才能在客户的网站上进行搜索。我最后做了一个简单的响应。重定向并通过查询字符串传入搜索参数,如下所示:

    protected void Button1_Click(object sender, EventArgs e)
    {
        string SearchQueryStringParameters = @"?SearchParameters=";
        string SearchURL = "Search.aspx" + SearchQueryStringParameters;
    
        Response.Redirect(SearchURL);
    }
    
    在您的Search.aspx页面的pageload中

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!string.IsNullOrEmpty(Request.QueryString["SearchParameters"]))
        {
            // prefill your search textbox
            this.txtSearch.Text = Request.QueryString["SearchParameters"];
    
            // run your code that does a search and fill your repeater/datagrid/whatever here
        }
        else
        {
            // do nothing but show the search page
        }
    }
    

    希望这有帮助。

    此功能允许使用GET方法提交页面

    要使用get方法提交页面,您需要:

  • 添加此代码Form.Method=“get”
  • 使用此代码作为提交按钮
  • rel=“do not submit”属性添加到不希望包含在查询字符串中的所有表单元素
  • 使用Request.QueryString更改页面的代码隐藏逻辑
  • 使用EnableViewState=“false”禁用页面视图状态(除非用于其他目的)
  • 代码

    $(document).ready(function(){ enableSubmitFormByGet(); });
    
    function enableSubmitFormByGet(){
       if($("form").attr("method") == "get"){
            $("form").submit(function() {
                $("[name^=" + "ctl00" + "]").each(function(i){
                var myName = $(this).attr("name");
                var newName = "p" + (i-1);
                $(this).attr("name", newName);
            });
         var qs =$(this).find("input[rel!='do-not-submit'],textarea[rel!='do-not-submit'],select[rel!='do-not-submit'],hidden[rel!='do-not-submit']").not("#__VIEWSTATE,#__EVENTVALIDATION,#__EVENTTARGET,#__EVENTARGUMENT").serialize();
         window.document.location.href = "?" + qs;
         return false;
    });
    

    只需在表单中使用此选项。在提交表单之前单击事件:

        $("#__VIEWSTATE").remove();
        $("#__EVENTVALIDATION").remove();
    

    是的,但正如您所说,我的母版页确实用主服务器表单包装了所有内容(因为每一个其他页面都是常规的.net Web表单),不过,谢谢您的回答!我在表单外部添加了另一个占位符,但在主内容分区中添加了另一个占位符。这取决于应用程序的布局,但有时是可能的,如果您的导航依赖于表单内部,则probby不可能。仅供参考-仅当您不创建自己的表单元素时才创建“包装器”表单。我到处都有带有HTML的母版页和母版页中的服务器端表单:)我也会说“使用HTML表单”,所以答案的这一部分是+1:)我希望有人告诉构建我刚刚访问的项目的人,不要用默认表单包装母版页。。可怕。它从form GET方法生成的结果querystring中删除viewstate和eventvalidation字符串。您可以将其粘贴到表单提交事件或提交按钮单击事件中。