如何使用带有GET的表单来使用查询字符串,但在查询字符串中没有VIEWSTATE?

时间:2012-04-20 22:07:18

标签: c# query-string viewstate

我正在尝试创建一个使用GET方法的C#网页,因此我可以将表单数据加入书签,通过电子邮件发送给其他人等,但是将表单方法更改为GET会导致包含VIEWSTATE的查询字符串。我可以取出runat = server标签(如上所述here),但后来我不知道如何设置表单字段的值。我不介意手动保持它们,但我无法弄清楚如何。

那么,我如何利用viewstate但将其保留在我的查询字符串之外,或者在没有runat = server的情况下访问表单控件?

1 个答案:

答案 0 :(得分:0)

例如,如果您在网页上使用搜索/过滤器表单,那么这是我在自己的代码中多次使用的模式。当用户提交一个按钮来处理他们在表单中输入的内容时,我让它像往常一样作为POST来代替我的代码。然后我手动构造一个GET请求并重定向到它:

protected void BtnSubmit_Click(object sender, EventArgs e)
{
    var query =
        "?filter1=" + TxtFilter1.Text +
        "&filter2=" + TxtFilter2.Text +
        "&filter3=" + TxtFilter3.Text; // etc.
    Response.Redirect(query);
}

然后在加载页面时,我处理查询字符串中的条目以预先填充页面上的相关表单控件:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        TxtFilter1.Text = Request.QueryString["filter1"] ?? "";
        TxtFilter2.Text = Request.QueryString["filter2"] ?? "";
        TxtFilter3.Text = Request.QueryString["filter3"] ?? "";
        // etc.
    }
}

这使我可以控制实际进入QueryString的内容,而不会搞乱ASP.Net管理的内置表单POST(包括View State)。此外,当用户填写表单并按下按钮时,他们有一个可链接的URL,即使它是一个POST,如果他们刷新页面,他们也不会收到关于将数据重新发送到服务器的恼人消息