【发布时间】:2008-11-25 15:40:29
【问题描述】:
我有一个母版页,上面有一个表单。这是一个必须始终可见的搜索表单。单击该表单的按钮时,我希望将表单数据发送到 search.aspx。问题是,我不知道怎么做。我无法将表单操作设置为 search.aspx,因为我使用主表单的所有其他页面都将转到 search.aspx。这是我不想要的。
希望有人可以帮助我:)
谢谢。
【问题讨论】:
标签: c# asp.net forms master-pages
我有一个母版页,上面有一个表单。这是一个必须始终可见的搜索表单。单击该表单的按钮时,我希望将表单数据发送到 search.aspx。问题是,我不知道怎么做。我无法将表单操作设置为 search.aspx,因为我使用主表单的所有其他页面都将转到 search.aspx。这是我不想要的。
希望有人可以帮助我:)
谢谢。
【问题讨论】:
标签: c# asp.net forms master-pages
为了传递控件“txtSearch”的值,当执行 Server.Transfer 时,您可以做很多事情,包括通过查询字符串变量传递它或设置会话变量,然后检查其中的任何一个Search.aspx 的 Page_Load 事件,如果已填充,则调用当用户点击 Search.aspx 页面上的提交按钮时触发的事件。
另外,如果 Search.aspx 文件使用相同的母版页,那么您可以使用 this.Master.FindControl("txtSearch") 来获取控件(它在生成后查看文件的来源)在浏览器中,您会注意到母版页中的控件实际上并不是由它们的 ID 调用的,而是附加了一些东西(即现在可能称为“ctl00_txtSearch”)
【讨论】:
您可以在单独的表单中创建搜索表单,并让它使用 GET 而不是 POST。
要么这样,要么让主表单处理单击搜索按钮并使用 Server.Transfer 转到搜索表单。
【讨论】:
我相信您可以在一个页面中拥有多个表单。因此,一个表单(您的搜索表单)将其操作设置为 search.aspx,而另一个将设置为页面本身。
【讨论】:
ASP.NET 网络表单页面只有一个表单(通常包含在母版页中)。您可以将搜索按钮的回发网址设置到您的搜索页面..
<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() - 它已经为您完成.
【讨论】:
我愿意:
我使用了类似的过程,在母版页上有一个 HTML 登录表单。
我发布了一个问题和后续解决方案here - 看看:
Form Elements in ASP.NET Master Pages and Content Pages
一旦我开始了解它,这似乎是一个非常简单且相当优雅的解决方案。
这样做的好处是您可以完全控制将数据发送到搜索表单的方式。而且您不需要启用将表单数据传输到搜索表单和所有讨厌的东西,只需向搜索页面创建一个新的 GET 请求并让它做它应该做的事情:)
希望这会有所帮助。
您在 ASPX 页面上只能有一个带有 runat="server" 的表单。 其他表单必须是 HTML 表单。
【讨论】:
由于您的搜索表单位于母版页中,您可以将其构建为包含 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 来访问输入。
【讨论】: