您可以使用C#在ASP.NET中触发回发吗?

问题描述

从研究中可以看出,我的问题的答案似乎是肯定的。

从@L_404_0@和Jonathan Wood's answer here看来,唯一的方法是使用JavaScript。可悲的是,我没有实现他们的解决方案所需的技能,而且我也不完全确定它会适合我的情况。看看您的想法:

我所拥有的(在VS2019中使用asp.net和C#)是一个treeview控件,它:

  • 1.1在第一级,显示客户名称
  • 1.2展开一个客户节点,下一级显示该客户的销售订单编号列表。
  • 1.3展开一个销售订单节点,第三级和最后一级显示属于该特定销售订单的销售项目的列表。

我应该想象的很标准的东西。现在,也很标准的是,当单击节点时,过程将使显示有关该对象信息的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();
    }
}