【问题标题】:How can I reset a asp.net form after postback?回发后如何重置 asp.net 表单?
【发布时间】:2009-03-30 16:41:51
【问题描述】:

我正在尝试在 btnCreate_OnClick 事件之后将表单重置为默认值,就像第一个 page_load 一样。问题是在 PostBack、每个文本框和其他控件重新加载 ViewState 值之后。由于 DropDownList 选择上的服务器事件,我无法停用视图状态。到目前为止,我发现的唯一方法是在单击事件后重定向到自身,但这会加载页面两次,因此是一个糟糕的解决方案。我尝试了 ViewState.Clear() 并更新了 UpdatePanel,但没有成功。

我可以对所有控件进行循环并设置 txtXXXXXX.Text == "",但我很确定这不是最好的主意。

像 Page.Reset() 这样的东西本来是完美的,但它不存在。

对我的这个问题有什么想法吗?

谢谢

【问题讨论】:

  • btnCreate_OnClick事件中除了重置表单还有代码吗?
  • 不,我也从 DB 执行 StoredProc。

标签: asp.net forms


【解决方案1】:

如果可行,我通常只使用 Response.Redirect 从头开始​​重新加载同一页面。

对页面的初始 GET 请求通常比后续 POST 花费更少,因此没有太多理由避免它。

【讨论】:

  • 这仅适用于通过重定向到页面加载相关记录的情况;因此这不能总是使用!
【解决方案2】:

我们只需两行代码就可以重置 ASP.NET 表单页面

protected void Button_Reset_Click(object sender, EventArgs e)
{
     Session["ViewState"] = null;
     Response.Redirect("/Roster/DRAC/Create.aspx");
}

【讨论】:

  • 只想说我一直在寻找这样一个简单的解决方案。谢谢你,拉詹!
  • 最好不要硬编码页面名称。
【解决方案3】:

由于视图状态,自我重定向变得棘手。

按钮有一个 html 输入类型“重置”,但我不确定 msft 为此在 viewstate/asp.net 中添加了什么或任何集成。它通常适用于简单的 javascript 表单。

例如:

<input type="button" value="Reset" onclick="document.<formId>.reset();">

来自谷歌----^

【讨论】:

    【解决方案4】:

    一种不一定理想的方法是使用 Javascript 将值重置为默认值。如果它是一个大表单,它可能会很丑,但会避免需要进行自我重定向。

    您也可以尝试使用 Server.Transfer 代替 Response.Redirect(/self/)

    【讨论】:

      【解决方案5】:

      我不知道这是否有帮助,但我更改了表单上每个输入的名称,我想在提交表单之前使用 javascript 获取新值,因为 .net 页面无法再匹配表单中的值它重新加载页面的控件,就好像没有回发一样。我还向表单附加了一个新值,这样我就知道是哪个按钮提交了表单,并使用该逻辑来决定将什么加载到所有控件中以及如何处理表单数据。

      $("#Bset").children().click(function() { //all the btns click function
          $.each($("form").find("input"), function(e,v) { //could filter this to subset of inputs
              $(v).attr("name", "_" + $(v).attr("name")); // ctrl1 becomes _cntrl1
          });
          $("form").append("<input type='hidden' id='b' name='b' value='" + $(this).text() + "' />").submit();
      });
      

      然后在后面的代码中

      protected void Page_Init(object sender, EventArgs e)
      {
          id = int.Parse(Request.QueryString["id"]);
          bk = db.dc.getDetailBK(id).Single();
          if (Request.Form.Count > 0)
              doPostBack();
          mrl = (from a in db.dc.getMetricQTD(id, null, null, loadSavedGoals) select a).ToList();
      }
      

      然后我可以在 dopostback 中处理表单数据、与数据库交互等,这可能会更改加载 mrl 的值并刷新与 mrl 相关的输入中的数据,无论它们是否被修改表格。

      另一种选择是绑定一些按钮以使用 Web 服务来处理您的数据库交互,然后调用 window.location 来刷新页面。

      $.ajax({
      网址:“网络服务/数据库功能?”
      数据:{按下了哪个 btn,一些表单值等...}
      成功:function() {window.location("samepage.aspx?id=xxx");}
      ...
      });

      这也将避免必须在服务器端响应重定向。

      【讨论】:

        【解决方案6】:

        在我们的例子中,最佳性能解决方案是为每个控件手动设置点击事件中的默认值,例如:

        textbox1.Text = null;
        textbox2.Text = null;
        

        这避免了双重 page_load 和循环。我们不必更新 UpdatePanel,因为它在渲染之前执行。

        也许在更复杂的 Web 应用程序中,我们必须重定向,因为大多数人似乎都接受这是一种解决方案。

        为每个控件设置默认值更适合我们的情况。

        谢谢

        【讨论】:

          猜你喜欢
          • 2019-05-09
          • 2010-10-11
          • 1970-01-01
          • 1970-01-01
          • 2011-01-22
          • 1970-01-01
          • 2016-11-01
          • 2017-12-16
          • 1970-01-01
          相关资源
          最近更新 更多