14

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

因此,当单击搜索按钮时,用户会转到search.aspx?q=the+query+he+entered

我想要这个的原因只是可添加书签的 URL,而且这样做感觉更干净。

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

我能想到的最好的办法是:

  1. 捕获按钮和的服务器端点击事件Response.Redirect
  2. 将 Javascriptonclick处理程序附加到触发window.location.replace.

两者都感觉古怪和次优......你能想出更好的方法吗?

4

6 回答 6

11

使用普通的旧 html 表单,而不是服务器端表单 (runat=server),您确实应该能够使其工作。

但是,如果您有一个开箱即用的 Visual Studio 母版页,它将整个页面包装在服务器端表单中,这可能是一个问题,因为您不能嵌套表单。

Web 表单不一定很糟糕,但默认实现通常会这样做。您不必为所有事情都使用 Web 表单。有时普通的旧 post/get 和处理请求代码就可以了。

于 2008-11-26T01:15:00.167 回答
7

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

protected void Button1_Click(object sender, EventArgs e)
{
    string SearchQueryStringParameters = @"?SearchParameters=";
    string SearchURL = "Search.aspx" + SearchQueryStringParameters;

    Response.Redirect(SearchURL);
}

在您的页面加载中的 Search.aspx 页面上...

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
    }
}

希望这可以帮助。

于 2010-04-12T17:55:17.660 回答
4

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

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

  1. 添加此代码 Form.Method="get"; 在 Page_Load 方法中
  2. 使用此代码< asp:Button runat="server" ID="btnGenerate" />作为提交按钮
  3. rel="do-not-submit"属性添加到您不想包含在查询字符串中的所有表单元素
  4. 使用Request.QueryString更改页面的代码隐藏逻辑
  5. 使用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;
});
于 2010-11-04T02:04:26.170 回答
0

我会做(b),因为(a)单个查询需要两次往返。或者,您可以禁用页面上的视图状态,通过 javascript 删除任何其他隐藏字段,还可以使用 javascript 将表单方法从 post 修改为 get。我从来没有真正做到这一点,但我的玩具页面使用包含的样本就像一个魅力。可以说它比编码搜索字符串和通过 javascript 进行获取更容易。

实际上,听起来您会更喜欢使用 ASP.NET MVC,因为这很容易通过在视图中将表单方法设置为 GET 来实现。

使用 jquery 的示例代码

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

编辑:似乎您也应该能够在服务器端做同样的事情。也许在 OnPreRenderComplete 中。目前无权访问 Visual Studio 进行检查。

于 2008-11-26T03:12:16.153 回答
0

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

我认为没有最佳方法。

于 2008-11-26T03:28:21.193 回答
0

只需在表单提交之前的 .click 事件中使用它:

    $("#__VIEWSTATE").remove();
    $("#__EVENTVALIDATION").remove();
于 2016-01-20T19:21:08.920 回答