在C#ASP.NET中维护跨站点的状态

时间:2010-07-11 23:36:13

标签: c# asp.net search hyperlink session-state

我有一个网站,可以从Twitter返回搜索结果,用C#ASP.NET编写。搜索效果非常好。

当用户看到结果时,我希望他们也有一个“下一页”类型的超链接,它将从上一个结果开始执行搜索(使用Twitter的next_page数据)。

如何保留属性,以便在单击链接时,它将使用不同的参数再次运行搜索以获得下一个结果?我不能使用表单,因为页面上已有一个表单,MS限制为每页一个表单(runat="server")。

请帮忙,这让我疯了。

PS我想过要包含代码,但不确定要包含哪些内容,因为它更多地与ASP.NET的工作方式有关,就像我自己的编码一样。

3 个答案:

答案 0 :(得分:2)

有两种简单的方法可以做到:

在url中包含一个参数,该参数是Next超链接的href,url可能如下所示:

http://mysite.com/myWebPage.aspx?currentPage=1

然后,您可以从后面代码中的查询字符串中访问该参数。

您也可以将其保存到会话:

Session["currentPage"] = 1;

然后在回发后你可以检查它:

int currentPage = 0;
if (Session["currentPage"] != null)
    int.TryParse(Session["currentPage"].ToString(), out currentPage);

使用Session会根据您的IIS设置自动过期,而使用querystring选项则不会过期(尽管用户可以使用它,因此您必须在使用之前对其进行验证)。

答案 1 :(得分:2)

有一百种不同的方法可以解决这个问题。 ASP.NET基础结构包含一个名为ViewState的东西,它允许页面及其控件在页面视图中保留任意数据和对象。

只有一个<form>,但您可以拥有无​​限数量的链接和按钮,这些链接和按钮以不同的方式提交表单 - 每个都可以在页面posts back时触发自己的方法。

在您的情况下利用此功能的一种简单方法是将页面参数存储在“下一页”链接中。这是一个非常简单的示例,假设您只需要知道页码,但它得到了重点:

<asp:LinkButton runat="server" ID="next_page" Text="Next Page" OnClick="NextPage_Click" />

...

void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack)
    {
        LoadData(0);
    }
}

void LoadData(int page)
{
    //pull page of data from twitter & show on page
    next_page.CommandArgument = (page+1).ToString();
}

void NextPage_Click(object sender, EventArgs e)
{
    int page = int.Parse(((LinkButton)sender).CommandArgument);
    LoadData(page);
}

在这个例子中,我们将LinkBut​​ton的CommandArgument属性设置为我们想要的页面索引。 LinkBut​​ton触发要调用的NextPage_Click方法,ASP.NET的ViewState基础结构允许持久保存CommandArgument值。

答案 2 :(得分:1)

让您的属性将其值保存到视图状态。

这样的事情:

public int PageNumber
{  
     get
     {         
          object value == this.ViewState["PageNumber"];
          if(value != null)
          { 
               return (int)value;
          }
          else
          {
               return 1;
          }
     }
     set
     { 
          this.ViewState["PageNumber"] = value;
     }
}