防止浏览器在刷新时显示查询重新提交对话框

时间:2009-03-13 21:48:33

标签: .net asp.net design-patterns

当用户从下拉列表中选择一个项目并按下按钮时,我的应用程序会显示根据所选值手动绑定和过滤的数据列表。如果用户按下浏览器的“刷新”按钮,则会询问用户是否确定要再次提交查询。

我不希望浏览器询问此问题。我该如何避免这种行为?

据我了解,这可以通过实现post / redirect / get模式来完成,但我不知道如何在ASP.NET 3.5中实现它。

2 个答案:

答案 0 :(得分:1)

浏览器重新提交的所有POST请求都将确认与用户重新提交。您无法在浏览器中更改此行为。

PRG模式对asp.net的意义在于您测试回发,执行处理,并将用户重定向到不同的页面(或具有不同查询字符串的同一页面以更改该页面的行为)。

这种模式的问题是你失去了asp.net的所有回发功能,比如viewstate和自动表单处理。

答案 1 :(得分:0)

是的,像你这样的事情会在你的页面加载事件中为你完成工作,例如:

// Check to see if the user submitted the form:
if (Page.IsPostBack){
  // Get the Params collection - query and forms
  NameValueCollection params = Request.Params;
  StringBuilder query = new StringBuilder();

  // Iterate over the params collection to build a complete
  // query string - you can skip this and just build it
  // manually if you don't have many elements to worry about
  for(int i = 0; i <= params.Count - 1; i++)
  {
    // If we're not on the first parameter, add an & seperator
    if (i > 0){
      query.Append("&");
    }

    // Start the query string 
    query.AppendFormat("{0}=", params.GetKey(i));

    // Create a string array that contains
    // the values associated with each key,
    // join them together with commas.
    query.Append(String.Join(",", pColl.GetValues(i));
  }

  Response.Redirect(String.Format("{0}?{1}", 
                      Request.Url.AbsolutePath, query.ToString()))
}

此模式的另一个问题是,您最终会在历史记录中使用此附加重定向,这可能会导致用户必须再次单击两次才能返回搜索表单。

从好的方面来说,他们现在可以非常愉快地为结果页面添加书签并返回结果,而无需重新提交表单。