第二次点击事件给出与第一次点击事件相同的结果

时间:2017-08-16 10:22:57

标签: c# asp.net c#-4.0

我有一个搜索页面说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);
}

1 个答案:

答案 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)
        }
    }
}