Asp.net 如何在回发后加载带有默认值的页面

Asp.net 如何在回发后加载带有默认值的页面,asp.net,user-controls,viewstate,Asp.net,User Controls,Viewstate,我正在创建用户控件,将其放入更新面板中,并仅在需要时使用触发器使其可见。一旦可见,它将在对话框中浮动,因此它有一个关闭按钮,只会隐藏客户端的控件 控件有多个回发状态,就像向导一样,我使用多视图控件来实现这一点。我的问题是,一旦用户在控件的第二步,如果用户关闭对话框,然后再次打开对话框(注意,该控件在服务器上可见,并通过更新updatepanel重新加载),第二步仍将显示。原因是。因为无论何时有回发,控件都将使用viewstate加载其状态,即使EnableViewState为false,它仍将使

我正在创建用户控件,将其放入更新面板中,并仅在需要时使用触发器使其可见。一旦可见,它将在对话框中浮动,因此它有一个关闭按钮,只会隐藏客户端的控件


控件有多个回发状态,就像向导一样,我使用多视图控件来实现这一点。我的问题是,一旦用户在控件的第二步,如果用户关闭对话框,然后再次打开对话框(注意,该控件在服务器上可见,并通过更新updatepanel重新加载),第二步仍将显示。原因是。因为无论何时有回发,控件都将使用viewstate加载其状态,即使EnableViewState为false,它仍将使用LoadControlState方法加载。因此,我的问题是如何强制用户控件在没有任何回发数据的情况下使用其默认值加载fresh。

我们也遇到过类似的情况,我们发现重置控件的唯一方法是在页面的代码隐藏中执行此操作。不是在ajax调用中,而是在提交页面时,因为这样我们可以设置属性并使它们进入viewstate

我很确定这会破坏你的设计

您是否考虑过将页面编写为RESTful?至少这样,您可以放弃viewstate,并对有意义的数据存储进行读写


ViewState可能是我选择MVC,现在避免使用类似瘟疫的WebForms的第一个原因。

如果它是一个使用对话框的向导,并且每个步骤都是必需的,那么不要使用关闭按钮。 如果用户关闭它,您可以刷新整个页面,这样用户就必须重新开始

我在WebForms中遇到了很多类似的问题,我只使用了UpdatePanel for ajax,因为它“看起来”是一个简单的选项。MVC听起来有点像一条学习曲线,的确如此,但是您可以通过使用MVC和jQuery构建页面来实现这一点,而无需使用MS ajax,也无需担心页面中的所有事件会不断发生冲突。在不了解MVC和弄脏你的手的情况下,很难迈出这一步,但这是值得的。

这是可能的

我在控件类中发现了一个名为ClearChildState()的秘密方法,这是一个受保护的方法,将清除所有ChildControl的viewstate和controlstate

所以在我的示例中,我创建了一个从panel继承的类

namespace MyControls
{
  public class Panel:System.Web.UI.WebControls.Panel
    {
        public void Reset()
        {
            ClearChildState();
        }
    }
}
在我的页面初始化事件中,我检查请求[flag]以重置控件

public partial class Test : System.Web.UI.Page
{
    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        if (!string.IsNullOrEmpty(Request["Reset"]) && Request["Reset"] == "1")
        {
            pnlCreateAccountDialog.Reset();               
        }
    }
}
在客户端,我有一个Reset()函数,每当我希望下一次回发时可以调用它来加载一个干净的控件

  <script type="text/javascript">
        function AddReset() {
            $('#Reset').val('1');
        }
        function RemoveReset() {
            $('#Reset').val('');
        }
    </script>

函数AddReset(){
$('#Reset').val('1');
}
函数删除集(){
$('#重置').val('');
}

听起来好像你在一个页面上做了太多的事情。这就是拥有控件的目的。这样我就可以在一个中心页面上做多个独立的事情。例如,假设我想显示一个create new account(创建新帐户)对话框,该对话框应该可以从每个页面的页眉获得,但无需将用户带到新页面,使用ajax,我应该能够将create account用户控件作为对话框加载,并允许用户填写几个步骤并关闭对话框,我看不出有什么理由不这样做。我正在考虑迁移到MVC,但我不确定这是否应该是迁移的原因,我想也许有一种方法可以在服务器上重置表单/控件,而不必手动停止每个属性。你能给我指一篇好文章吗?如何使WebForms应用程序在不做太多更改的情况下恢复完整?我完全同意你的观点,但由于我的天性,我到处乱跳,几乎无法完成事情,我正试图控制我的动作;-)突然谈论我的应用程序,并将其转换为MVC,这正是我的应用程序渴望停止前进的原因。因此,我想从WebFrom内部迁移到mvc,通过尽可能地重新组织webforms应用程序,使其表现得像mvc架构,这样迁移到mvc就不会是一次剧烈的跳跃。有什么建议吗?一个想法:把MVC想象成有点像ASP,在那里你可以用ASP调用公共方法做循环,例如,这样你的html可以非常基本,不使用ASP控件,将来可以很容易地支持MVC[其他人可能认为这不是一个好主意]