我正在创建用户控件,我将放入更新面板并仅在需要时使用触发器使其可见。一旦可见,它将浮动在一个对话框中,因此它有一个关闭按钮,它只是隐藏客户端的控件。
控件有多个回发状态,就像向导一样,我正在使用多视图控件来实现这一点。我的问题是,一旦用户在控件中的第二步,如果用户关闭对话框,则再次打开对话框(注意控件在服务器上可见并通过更新updatepanel重新加载)第二步仍会显示。原因是 。因为只要有回发,控件就会使用viewstate加载其状态,即使EnableViewState为false,它仍然会使用LoadControlState方法加载它。所以我的问题是如何强制用户控件在没有任何回发数据的情况下使用其默认值加载新鲜。
答案 0 :(得分:0)
我们有类似的情况,我们发现重置控制的唯一方法是在页面后面的代码中执行此操作。不是在ajax调用中,而是在提交页面时,因为我们可以设置属性并让它们进入viewstate。
我很确定这会打破你的设计。
您是否考虑过将该网页编写为RESTful?至少那时你可以放弃viewstate并读取和写入有意义的数据存储。
ViewState可能是我进入MVC的首要原因,现在避免像瘟疫这样的WebForms。
答案 1 :(得分:0)
如果它是一个使用对话框并且需要每个步骤的向导,则没有关闭按钮。 如果用户关闭它,您可以刷新整个页面,以便用户必须重新开始?
我有很多这样的问题与WebForms,我只使用UpdatePanel for ajax,因为它“看起来”像一个简单的选项。 MVC听起来像是一个学习曲线,然而,你可以通过使用MVC和jQuery构建页面而不需要MS ajax以及页面中经常互相争斗的所有事件的麻烦来实现。如果不了解MVC并将你的手弄得很脏,很难做到这一步,但它值得。
答案 2 :(得分:0)
它是可能的。
我在控件类中找到了一个名为ClearChildState()的秘密方法,这是一个受保护的方法,它将清除所有子控件的viewstate和controlstate。
所以在我的例子中,我创建了一个继承自面板
的类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();
}
}
}
OnClient方面我有一个Reset()函数,每当我希望下一个回发加载一个干净的控件时我都可以调用它
<script type="text/javascript">
function AddReset() {
$('#Reset').val('1');
}
function RemoveReset() {
$('#Reset').val('');
}
</script>