如何在 postback 后重置 asp.net 表单?

5
我在btnCreate_OnClick事件后尝试将表单重置为其默认值,就像第一次page_load那样。问题是,在PostBack之后,每个文本框和其他控件都重新加载ViewState值。我无法停用ViewState,因为DropDownList选择上有服务器事件。到目前为止,我找到的唯一方法是在单击事件后重定向到自身,但这会导致页面加载两次,因此不是一个好的解决方案。我尝试使用ViewState.Clear()并更新UpdatePanel,但没有成功。
我可以循环遍历所有控件,并将txtXXXXX.Text设置为"",但我相当确定这不是最好的想法。
类似于Page.Reset()的东西就完美了,但它并不存在。
对于我的这个问题,有什么想法吗?
谢谢

btnCreate_OnClick事件中除了重置表单之外还有其他的代码吗? - Dan Appleyard
我也从数据库执行存储过程。 - jpsimard-nyx
6个回答

12
如果可行,我通常只使用Response.Redirect来重新加载同一页面。
对于一个页面的初始GET请求,通常比后续的POST请求成本更低,因此没有太多的理由去避免它。

2
这仅适用于通过重定向到页面加载的记录的情况;因此,这并非总是可用! - renegadeMind

7
我们只需两行代码就可以重置ASP.NET表单页面。
protected void Button_Reset_Click(object sender, EventArgs e)
{
     Session["ViewState"] = null;
     Response.Redirect("/Roster/DRAC/Create.aspx");
}

我只想说,我已经寻找像这样简单的解决方案有一段时间了。谢谢你,Rajan! - Justin Holdsclaw
最好不要硬编码页面名称。 - NetMage

2

自动重定向由于视图状态而变得棘手。

有一个用于按钮的HTML输入类型“reset”,但我不确定微软是否已将其集成到ViewState/ASP.NET中。它通常适用于简单的JavaScript表单。

例如:

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

来自Google ----^


0

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

您还可以尝试使用Server.Transfer而不是Response.Redirect(/self/)


0

我不知道这是否有帮助,但在提交表单之前,我使用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相关联的输入框中的数据,无论它们是否在表单上被修改过。

另一种选择是将一些按钮绑定到使用webservice来处理数据库交互,然后调用window.location来刷新页面。

$.ajax({
url: "webservice/dbfunction?"
data: {点击的按钮,一些表单值等等...}
success: function() {window.location("samepage.aspx?id=xxx");}
...
});

这样也避免了在服务器端进行响应重定向。


-3
在我们的情况下,最佳性能解决方案是在单击事件中手动为每个控件设置默认值,例如:
textbox1.Text = null;
textbox2.Text = null;

这样可以避免双重页面加载和循环。我们甚至不必更新UpdatePanel,因为它在渲染之前执行。

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

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

谢谢


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接