【问题标题】:how do I invoke a post-back from code behind?如何从后面的代码调用回发?
【发布时间】:2015-05-11 17:36:39
【问题描述】:

我的用户控件在“回发时间线”中加载得太晚时遇到问题,因为它们是由于自定义事件而被加载的。

因此,此用户控件上的按钮单击事件不会在第一次单击时触发(整个回发仅发生单击的事件处理程序不会引发)。然而,在第二次点击(因此是第二次回发)时,事件处理程序工作正常。

我怎样才能在一个刚刚完成后立即自动调用第二个回发?所以我的用户控件被正确加载了。

默认页面

public interface IEventProvider
{
    void TriggerEvent(String path);
}


public partial class Default : System.Web.UI.Page, IEventProvider
{
    private string LastLoadedControl
    {
        get
        {
            return Session[Paths.CURRENTCTRL] as string;
        }
        set
        {
            Session[Paths.CURRENTCTRL] = value;
        }
    }

    private void LoadUserControl()
    {
        string controlPath = LastLoadedControl;

        ContentPlaceholder.Controls.Clear();

        if (string.IsNullOrEmpty(controlPath))
            controlPath = Utils.Paths.USERCTRL_BASE + "Main.ascx";

        Control uc = Page.LoadControl(controlPath);
        ContentPlaceholder.Controls.Add(uc);
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        LoadUserControl();
    }

    public void TriggerEvent(String path)
    {
        if (path.Equals("logout"))
        {
            Session.Clear();
            Session.Abandon();
            LastLoadedControl = null;
        }
        else LastLoadedControl = Paths.USERCTRL_BASE + path + ".ascx";
        LoadUserControl();
    }
}

用户控制代码

protected void profileBtn_Click(object sender, EventArgs e)
    {
        Utils.Events.triggerRedirectPage(this.Page, "Login");
    }

事件代码

 public static void triggerRedirectPage(Page p, String path)
    {
        IEventProvider eventProvider = p as IEventProvider;
        if (eventProvider != null)
            eventProvider.TriggerEvent(path);
    }

【问题讨论】:

  • 我认为您正在尝试修复错误代码的症状,而不是修复错误代码。你永远不想有双重回发。如果您的事件没有第一次连接,请修复它。
  • 我不知道如何整理时间以便用户控件完全加载。事件总是最后触发,这导致用户控件在操作中加载得太晚。主页如何检测用户控件中的按钮单击,然后加载另一个用户控件,因为它足够早以使其完全加载。
  • 您可以在您的用户控件中使用此代码来调用父级上的方法:this.Page.GetType().InvokeMember("MyMethodName", System.Reflection.BindingFlags.InvokeMethod, null, this.Page, new object[] { }); 那么您不依赖于事件。
  • 你能在该技术中包含参数吗?
  • 是的,最后一个参数new object[] { } 用于参数

标签: c# asp.net user-controls postback code-behind


【解决方案1】:

您可以使用AllowPostBack=true 添加一个按钮(或其他控件),然后在此按钮上触发点击事件。

【讨论】:

  • 使用javascript触发?我还可以使用注册启动脚本注入 __dopostback 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多