问题描述
从研究中可以看出,我的问题的答案似乎是肯定的。
从@L_404_0@和Jonathan Wood's answer here看来,唯一的方法是使用JavaScript。可悲的是,我没有实现他们的解决方案所需的技能,而且我也不完全确定它会适合我的情况。看看您的想法:
我所拥有的(在VS2019中使用asp.net和C#)是一个treeview控件,它:
我应该想象的很标准的东西。现在,也很标准的是,当单击节点时,过程将使显示有关该对象信息的formview可见。单击客户节点时,它将显示客户表单视图。单击销售订单节点时,将显示一个销售订单表单视图。单击销售商品节点时,您可能会猜到其显示的内容。
这就是事情开始偏离轨道的地方。单击节点后,其Value属性存储在名为_id的变量中。然后将此变量存储在ViewState中。当发生PostBack时,其想法是Page_Load事件将从ViewState读取_id的值,运行showFormViews()过程并显示相关的formview。我的布局是这样的:
protected void Page_Load(object sender,EventArgs e)
{
if (ViewState["_id"] == null)
{
_id = "";
}
else
{
_id = Convert.ToString(ViewState["_id"]);
}
if (!IsPostBack)
{
fillTreeView;
tv.CollapseAll();
}
showFormViews();
}
以及单击节点时:
protected void tv_SelectednodeChanged(Object sender,EventArgs e)
{
// (a) PostBack occurs and Page_Load is run *before* _id is set and stored in ViewState
_id = tv.Selectednode.Value;
ViewState.Add("_id",_id);
showFormViews();
// (b) would be great to be able to fire off a PostBack programmatically right here!
}
(。aspx标记只是一个TreeView和链接到ObjectDataSources的三个FormView)
正如我现在从this helpful page所知道的:
“页面生命周期的初始化部分将在 导致回发的控件的事件处理程序。因此 页面的Init和Load事件处理程序中的代码将在 用户单击按钮的事件处理程序中的代码。”
如上面(a)行所述,当单击树视图节点时,页面将回发并运行Page_Load,而_id仍为null。由于_id为null,因此showFormViews()过程将隐藏所有formview。
然后,触发SelectednodeChanged事件,设置_id,并且showFormViews()过程将相关的formview设置为可见。但是,当然,到目前为止,所有控件都已呈现,因此...什么都没有发生。
能够以某种方式在(b)行触发回发,效果很好。 Page_Load将触发并运行showFormViews(),但是这次 _id是应该的。
(b)行的各种变化
Server.Transfer("samePage.aspx");
// or
Response.Redirect(Request.RawUrl,false);
不起作用,因为它们会破坏ViewState(除非有人知道不同吗?),因此_id又回到了null。
因此,如果您无法在C#中触发PostBack,并且如果我无法解决如何通过上述两个张贴者来实现解决方案(或者即使在这种情况下它们是合适的),那么有什么办法我可以对页面进行重组以使其正常工作(我可以想象是一种常见的模式)(并且请不要建议使用MVC-我试图学习这一点,但仍然有噩梦!)。
在此先感谢
解决方法
您可以在PageLoad中调用用于填充ViewState的方法...
protected void Page_Load(object sender,EventArgs e)
{
if (ViewState["_id"] == null)
{
_id = "";
}
else
{
_id = Convert.ToString(ViewState["_id"]);
tv_SelectedNodeChanged(null,null);
}
if (!IsPostBack)
{
fillTreeView;
tv.CollapseAll();
}
}