1

我有一个母版页,上面有一个表格。这是一个必须始终可见的搜索表单。单击该表单的按钮时,我希望将表单数据发送到 search.aspx。问题是,我不知道怎么做。我无法将表单操作设置为 search.aspx,因为使用主表单的所有其他页面都将转到 search.aspx。这是我不想要的。

希望有人可以帮助我:)

谢谢。

4

6 回答 6

1

您可以在单独的表单中创建您的搜索表单,并让它使用 GET 而不是 POST。

要么,要么让主表单处理搜索按钮单击并使用 Server.Transfer 转到搜索表单。

于 2008-11-25T15:45:13.047 回答
1

我相信你可以在一页中有多个表格。因此,一个表单(您的搜索表单)将其操作设置为 search.aspx,而另一个表单将设置为页面本身。

于 2008-11-25T15:45:24.747 回答
1

为了传递控件“txtSearch”的值,当执行 Server.Transfer 时,您可以做很多事情,包括通过查询字符串变量传递它或设置会话变量,然后在 Page_Load 事件中检查其中任何一个Search.aspx,如果已填充,则调用当用户点击 Search.aspx 页面上的提交按钮时触发的事件。

此外,如果 Search.aspx 文件使用相同的母版页,那么您可以使用 this.Master.FindControl("txtSearch") 来获取控件(在浏览器中生成文件后,您可以查看文件的来源,您会注意到母版页中的控件实际上并不是由它们的 ID 调用的,而是附加了一些东西(即现在可能称为“ctl00_txtSearch”)

于 2008-11-25T16:21:53.113 回答
0

ASP.NET Web 表单页面只有一个表单(通常包含在母版页中)。您可以将搜索按钮的回发网址设置到您的搜索页面。

<asp:Button ID="btnSearch" runat="server" Text="Search" PostBackUrl="~/search.aspx" />

..或者只是从母版页中的处理程序重定向到它,如下所示:

protected void btnSearch_Click(object sender, EventArgs e)
{
    Response.Redirect(@"~/search.aspx?q=" + Server.UrlEncode(txtSearch.Text)); 
}

..或按照 David Kemp 的建议使用 Server.Transfer。

注意:如果您在搜索页面上使用 Request.Query[@"q"] 来获取查询,则不需要使用 Server.UrlDecode() - 它已经为您完成了。

于 2008-11-25T16:20:42.443 回答
0

我会:

  • 向母版页代码隐藏添加一些代码以检测 POST 的来源。
  • 一旦我有了 POST 的来源(例如搜索框)。然后我会将其查询传递给搜索表单。

我使用了类似的过程,在母版页上有一个 HTML 登录表单。

我在这里发布了一个问题和后续解决方案- 看看:

ASP.NET 母版页和内容页中的表单元素

一旦我了解它,它似乎是一个非常简单且相当优雅的解决方案。

这样做的好处是您可以完全控制如何将数据发送到搜索表单。而且您不需要启用将表单数据传输到搜索表单和所有讨厌的东西,只需向搜索页面创建一个新的 GET 请求并让它做它应该做的事情:)

希望这可以帮助。

笔记:

runat="server"一个 ASPX 页面上只能有一个表单。其他表单必须是 HTML 表单

于 2008-11-25T16:29:26.483 回答
0

因为您的搜索表单位于母版页中,所以您可以将其构建为包含 2 个表单。将操作设置为“search.aspx”的搜索表单标记放置在站点其余部分使用的标记之外。

<body>
    <form action="search.aspx>
        <!--search box and submit button-->
    </form>
    <form runat="server">
        <!--rest of page inc placeholder-->
    </form>
</body>

如果页面结构无法启用此功能,您可以将提交按钮的 PosbackUrl 设置为指向“search.aspx”。在这种情况下,需要对“search.aspx”进行编码以在 PreviousPage 属性中查找表单数据,或者使用 Request.Form 访问输入。

于 2008-11-25T18:34:58.320 回答