我有一个搜索页面说default.aspx 用户可以搜索属性。
在页面加载时,如果它没有回发,则调用后面的函数,它只取出3个属性:
GetDefault();
GetDefault()的语法:
private void GetDefault()
{
DataTable dtProperties = Service.GetDefaultList();
}
如果它回发跟随函数被调用,它将取出所有属性:
GetProperties(city, state, country);
{
DataTable dtProperties = service.GetPropertyList(city, state, country)
}
有一个搜索按钮,用于搜索该属性。 我已经实现了这样的功能,用户可以直接输入整个URL,如www.mysite.com/default.aspx?city=1&state=2,这将在页面加载时为他提供搜索结果。
在搜索按钮上单击以下功能会生成URL,任何其他用户都可以直接将其放在他/她的浏览器上。可以得到尊重的搜索结果。
protected void btnSearch_Click(object sender, EventArgs e)
{
//TO build URL
string RootUrl = WebConfigurationManager.AppSettings["WEBROOT"];
String target_url = "";
if ((Request.Form["search_by_city"])!= "")
{
string cityName = service.getCityByID(Int32.Parse(search_by_city.Value)).ToString();
target_url += "&city=" + cityName;
}
else
{
city = 0;
}
if ((Request.Form["search_by_state"]) != "")
{
string stateName= service.getStateNameByID(Int32.Parse(search_by_state.Value)).ToString();
target_url += "&state=" + stateName;
}
else
{
state = 0;
}
if ((Request.Form["search_by_country"]) != "")
{
string countryName = service.getCountryNameByID(Int32.Parse(search_by_country.Value)).ToString();
target_url += "&country=" + countryName;
}
else
{
country= 0;
}
string mainUrl = RootUrl + "/default.aspx?" + target_url;
Response.Redirect(mainUrl);
}
此代码根据提交的表单值生成URL。
页面加载事件如下:
protected void Page_Load(object sender, EventArgs e)
{
//To decode filters
//To get city
if (Request.QueryString["city"] != null)
{
string aCityName = Request.QueryString["city"].ToString();
cityID = service.getCityByName(aCityName);
search_by_city.Value = cityID.ToString();
}
else
{
cityID = 0;
}
//To get state
if (Request.QueryString["state"] != null)
{
string aState = Request.QueryString["state"].ToString();
state = service.getStateByName(aState);
search_by_state.Value = state.ToString();
}
else
{
state= 0;
}
//To get country
if (Request.QueryString["country"] != null)
{
string aCountry = Request.QueryString["country"].ToString();
country = DLResale.getConfigByName(aCountry);
search_by_country.Value = country.ToString();
}
else
{
country= 0;
}
if (Request.QueryString.Count == 0)
{
if (!IsPostBack)
{
GetDefault();
}
else
{
GetProperties(city, state, country);
}
}
else
{
GetProperties(city, state, city)
}
}
当用户第一次进行搜索时,所有代码都可以正常工作。
比如说,第一次用户搜索city = 1,state = 2
它给出了准确的搜索结果。但是当用户再次点击具有不同搜索条件的搜索按钮时,请说:city = 2,state = 2 它不提供精确搜索,而是给出第一个搜索条件的结果!
任何人都可以搞清楚任何错误吗?
页面加载事件是否存在任何问题?
或者代码?????
需要进行任何更改此代码取出所有属性&为了分页的目的,每页限制15个属性:
private void GetProperties(int city, int state, int country)
{
DataTable dtProperties = service.GetPropertyList(city, state, country);
if (dtProperties.Rows.Count > 0)
{
last = dtProperties.Rows.Count - 1;
PagedDataSource pageds = new PagedDataSource();
DataView dv = new DataView(dtProperties);
pageds.DataSource = dv;
pageds.AllowPaging = true;
pageds.PageSize = 15;
if (ViewState["PageNumber"] != null)
{
pageds.CurrentPageIndex = Convert.ToInt32(ViewState["PageNumber"]);
}
else
{
pageds.CurrentPageIndex = 0;
}
if (pageds.PageCount > 1)
{
rptPaging2.Visible = true;
rptPaging.Visible = true;
ArrayList pages = new ArrayList();
for (int i = 0; i < pageds.PageCount; i++)
pages.Add((i + 1).ToString());
rptPaging.DataSource = pages;
rptPaging.DataBind();
}
else
{
rptPaging.Visible = false;
rptPaging2.Visible = false;
//ErrorNoPropertiesDiv.Visible = true;
}
rptProperties.DataSource = pageds;
rptProperties.DataBind();
}
else
{
ErrorNoPropertiesDiv.Visible = true;
rptProperties.Visible = false;
rptPaging2.Visible = false;
}
}
正如@Chetan Ranpariya建议的那样,它正在发挥作用,但是分页开始出现问题。它给出了所有55个属性,但是当我点击第二页时它给出零结果,理想情况下它应该显示接下来的15个属性。
处理分页的代码如下:
public int PageNumber
{
get
{
if (ViewState["PageNumber"] != null)
return Convert.ToInt32(ViewState["PageNumber"]);
else
return 0;
}
set
{
ViewState["PageNumber"] = value;
}
}
protected void rptPaging_ItemDataBound(object source, RepeaterItemEventArgs e)
{
LinkButton lnk = (LinkButton)e.Item.FindControl("lnkPage");
if (lnk.CommandArgument.ToString() == (PageNumber + 1).ToString())
{
lnk.BackColor = System.Drawing.Color.Black;
}
}
protected void rptPaging_ItemCommand(object source, RepeaterCommandEventArgs e)
{
ViewState["PageNumber"] = Convert.ToInt32(e.CommandArgument) - 1;
GetProperties(city, state, country);
}
答案 0 :(得分:0)
问题在于您的Page_Load
代码。当您使用city=1&state=2&country=3
直接浏览网址时,它会按预期工作。但是当您更改其中一个下拉列表中的值并单击该按钮时,PostBack
会发生,并且PostBack不会更改URL。这首先执行Page_Load
。由于您首先检查查询字符串,因此您仍然会从查询字符串中获取旧值city=1&state=2&country=3
,您也将search_by_city.Value = cityID.ToString();
分配给下拉列表。
在Page_Load
之后,按钮点击的实际事件处理程序执行,并且在那时控制&#39;值会更改为旧值,从而使用旧值创建重定向网址,这是您查看旧搜索结果的原因。
要解决此问题,您应将Page_Load
的代码更改为以下内容。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Request.QueryString.Count == 0)
{
// If it is not post back and no querystring parameters,
// load default properties.
GetDefault();
}
else
{
// If there are any querystring parameters,
// Use them to filer the result and set the control values.
if (Request.QueryString["city"] != null)
{
string aCityName = Request.QueryString["city"].ToString();
cityID = service.getCityByName(aCityName);
search_by_city.Value = cityID.ToString();
}
else
{
cityID = 0;
}
//To get state
if (Request.QueryString["state"] != null)
{
string aState = Request.QueryString["state"].ToString();
state = service.getStateByName(aState);
search_by_state.Value = state.ToString();
}
else
{
state = 0;
}
//To get country
if (Request.QueryString["country"] != null)
{
string aCountry = Request.QueryString["country"].ToString();
country = DLResale.getConfigByName(aCountry);
search_by_country.Value = country.ToString();
}
else
{
country = 0;
}
GetProperties(city, state, city)
}
}
}