首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP中用于从用户控件到父页的通信有哪些技术?

ASP中用于从用户控件到父页的通信有哪些技术?
EN

Stack Overflow用户
提问于 2015-03-04 09:57:16
回答 1查看 304关注 0票数 0

我在从用户控件到主页的通信中遇到了一些问题。引发事件的顺序意味着用户控件上的操作在回发中发生得太晚,不会对主页产生影响。

例如,我在用户控件上有一个按钮,当按下该按钮时,会引发一个自定义事件,该事件将在主页上侦听。当按下按钮时,回发顺序是:

  • page_load -在主页上
  • page_load -在用户控件上(用户控件由主页page_load以编程方式加载)
  • 用户控件上的按钮回调。
  • 主页上的事件回调方法

至此,事件回调方法对呈现的页面产生任何影响似乎为时已晚,例如,我试图使用它来更改正在显示的用户控件。

在这种交流中还可以使用什么其他的技术呢?

相关代码主页:

代码语言:javascript
复制
    public string LastLoadedControl
    {
        get
        {
            return Session["LastLoaded"] as string;
        }
        set
        {
            Session["LastLoaded"] = 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();
        if (!IsPostBack)
            Utils.Events.redirectPage += Events_redirectPage;

    }

    private void Events_redirectPage(string path)
    {

        if (path.Equals("Main"))
        {
            //Session.Clear();
            //Session.Abandon();
        }
        else LastLoadedControl = Paths.USERCTRL_BASE + path + ".ascx"
        LoadUserControl();
    }

用户控制

代码语言:javascript
复制
    protected void profileBtn_Click(object sender, EventArgs e)
    {
        Utils.Events.triggerRedirectPage("Login");
    }

事件

代码语言:javascript
复制
public class Events
{
    public delegate void redirectEvent(string path);
    public static event redirectEvent redirectPage;

    public static void triggerRedirectPage(String path)
    {
        if (Utils.Events.redirectPage != null)
            Utils.Events.redirectPage(path);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-04 10:16:05

有两种方法你可以遵循。

方法1:

代码语言:javascript
复制
public interface IEventProvider
{
  void TriggerEvent();  
}

public class YourPage: Page, IEventProvider
{
   // Other page methods

   public void TriggerEvent()
   {
     // Your Implementation
   }
}

public class YourUserControl : WebUserControl
{
    protected void profileBtn_Click(object sender, EventArgs e)
    {
        IEventProvider eventProvider = this.Page as IEventProvider;
        if(eventProvider != null)
           eventProvider.TriggerEvent();
    }
}

方法2:

代码语言:javascript
复制
public interface IEventProvider
{
    // This does not have to be a boolean. You can use a string / enum / anything that suits your implementation
    bool Trigger {get; set;}
}

public class YourPage: Page, IEventProvider
{
   // Other page methods

   protected override void OnLoadComplete(EventArgs e)
   {
     // This will be raised when all the events have fired for all the controls in the page. 
     if(this.Trigger)
        TriggerEvent();
   }

   protected void TriggerEvent()
   {
     // Your code here
   }

   public bool Trigger
   {
     get;
     set;
   }
}

public class YourUserControl : WebUserControl
{
    protected void profileBtn_Click(object sender, EventArgs e)
    {
        IEventProvider eventProvider = this.Page as IEventProvider;
        if(eventProvider != null)
           eventProvider.Trigger = true;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28851398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档