我有一个显示网格视图的搜索页面。gridview 中的项目是创建 url 字符串返回同一页面的超链接 - index.aspx
我有 index.asp 检查查询字符串的存在并处理得很好。
我遇到的问题是当用户想要输入一个新的搜索,这是一个表单提交。但是,回发仍然包含先前的 url 查询字符串 - 所以我的部分代码处理请求而不是搜索。
环顾四周,我发现了 PostBackURL:
<asp:Button ID="btn_Search" runat="server" Text="Search" Cssclass="form_btn" OnClick="btn_Search_Click" PostBackUrl="index.aspx" />
在测试中,这成功了。表单提交到index.aspx 不是说index.aspx?Var1=1&Var2=2
但是,当我发布到实时站点时,这不起作用。我仍然会收到 url 字符串的回复。
asp 为按钮和 javascript 代码输出的代码是相同的。
我对asp相当陌生,但我很困惑在VS2010中运行调试和在网络服务器上实时运行时行为不同。
--
好的,进一步调查。我正在运行 Cassini,但是.. 我的表单上有两个按钮 - 一个是搜索,另一个是清除。
两个按钮生成相同类型的 html:
<input type="submit" name="ctl00$MainContent$btn_Search" value="Search" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$MainContent$btn_Search", "", false, "", "Index.aspx", false, false))" id="MainContent_btn_Search" class="form_btn" />
<input type="submit" name="ctl00$MainContent$btn_Clear" value="Clear" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$MainContent$btn_Clear", "", false, "", "Index.aspx", false, false))" id="MainContent_btn_Clear" class="form_btn" />
上面的唯一区别是它们将在服务器上调用的名称、值和函数 - btn_clear 或 btn_Search。
清除按钮与实时站点上的 postbackurl 一起使用;搜索按钮没有。
此外,一旦提供了一个页面,是否不能由该页面来确定它接下来在哪里发布数据?所以如果页面说我要去这里,那就是它去的地方。我的清除按钮显示没有 url 查询字符串的 goto index.aspx,它可以工作。
这让我感到困惑 - 如果清除按钮在实时站点上不起作用,我会认为这要么与卡西尼有关,要么正在开发中,它是一台 pc 与 live 有 pc 和服务器。另外,如果是浏览器发出下一步去哪里的命令,这怎么可能是 cassini/IIS 问题?
如果我想进一步了解这一点,我可能需要使用wireshark 或类似工具来查看当我按下搜索或清除时实际离开浏览器窗口的内容。
好的测试项目完成。我已验证此代码在调试中可以按我的意愿工作。直到星期一我才能测试到 IIS 的实时部署。
page1.aspx 文件:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="page1.aspx.cs" Inherits="page1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:GridView ID="gridview1" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:HyperLinkField DataNavigateUrlFields="intVal"
DataNavigateUrlFormatString="page1.aspx?Var={0}" DataTextField="intVal"
HeaderText="URL String" />
</Columns>
</asp:GridView>
<br />
<br />
Search <asp:TextBox runat="server" ID="searchtext"></asp:TextBox><br />
<asp:Button ID="btn_Search" runat="server" Text="Search" OnClick="btn_Search_Click" PostBackUrl="page1.aspx" />
<asp:Button ID="btn_Clear" runat="server" Text="Clear" OnClick="btn_Clear_Click" PostBackUrl="page1.aspx" /><br />
Result:<br /><br />
<asp:Label runat="server" ID="result">Initial Load</asp:Label>
</form>
</body>
</html>
页 1aspx.cs 文件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class page1 : System.Web.UI.Page
{
public class MyItem
{
public int intVal {get; set;}
public string stringVal {get; set;}
}
List<MyItem> ListMyItem = new List<MyItem>();
protected void Page_Load(object sender, EventArgs e)
{
BuildList();
result.Text = "Page Load: " + Request.Url;
}
protected void BuildList()
{
MyItem MI = new MyItem();
MI.intVal = 1;
MI.stringVal = "111";
ListMyItem.Add(MI);
MI = new MyItem();
MI.intVal = 2;
MI.stringVal = "222";
ListMyItem.Add(MI);
gridview1.DataSource = ListMyItem;
gridview1.DataBind();
}
protected void btn_Clear_Click(object sender, EventArgs e)
{
result.Text = "Clear, URL: " + Request.Url + " Search= " + searchtext.Text;
}
protected void btn_Search_Click(object sender, EventArgs e)
{
result.Text = "Search, URL: " + Request.Url + " Search= " + searchtext.Text;
}
}