GVKun编程网logo

在PHP中替代ASP.NET的UserControls?(php 替代)

456

关于在PHP中替代ASP.NET的UserControls?和php替代的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于.net–Masterpage与Usercontrol与Custom

关于在PHP中替代ASP.NET的UserControls?php 替代的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于.net – Masterpage与Usercontrol与Customcontrol之间的区别、Asp.net UserControl LoadControl问题、ASP.NET UserControl 通信的具体实现、ASP.NET UserControl不初始化子控件等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

在PHP中替代ASP.NET的UserControls?(php 替代)

在PHP中替代ASP.NET的UserControls?(php 替代)

我在ASP.NET中开发了许多Web应用程序,我在其中使用UserControl来管理页眉和页面的任何其他常见部分.现在我正在用PHP开发一个应用程序,有什么我可以用作UserControls的替代品吗?

我如何在PHP中实现类似的概念?

谢谢?

解决方法:

第二个答案在这里有点难以详细解释,就是建立自己的’UserControl’类. Classes将具有您需要的必要属性,并且具有将控件输出到屏幕的RenderHTML()方法.

.net – Masterpage与Usercontrol与Customcontrol之间的区别

.net – Masterpage与Usercontrol与Customcontrol之间的区别

请帮助我理解Master页面与Usercontrol与Custom控件之间的区别

解决方法

在这里检查类似问题的答案:

ASP.Net Custom controls vs. user controls: Are these two the same

母版页实际上是用户控件;您可以通过转到主页类的代码隐藏来验证这一点,右键单击类名并选择“转到定义”.你会看到这样的东西:

public class MasterPage : UserControl
{
    ...
}

用户控件便于显示使用单个项目重复的显示组件,例如菜单和面板.问题是,如果需要,它们不会生成.DLL并且必须手动复制到其他项目.

另一方面,自定义控件可以在单独的类库中创建,并根据需要在其他项目中重用.使用自定义控件时,必须完全在代码中创建显示工件,并且开发需要稍长的时间.

查看Microsoft的用户控件和自定义控件之间的比较:

http://support.microsoft.com/kb/893667

Asp.net UserControl LoadControl问题

Asp.net UserControl LoadControl问题

使用LoadControl(type,Params)时,我遇到了一个问题.让我解释…

我有一个超简单的用户控制(ascx)

<%@ Control Language="C#" AutoEventWireup="True" Inherits="Errordisplay" Codebehind="Errordisplay.ascx.cs" EnableViewState="false" %>

<asp:Label runat="server" ID="lblTitle" />
<asp:Label runat="server" ID="lblDescription" />

与代码(c#)后面:

public partial class Errordisplay : System.Web.UI.UserControl
{

    private Message _ErrorMessage;    

    public Errordisplay()
    {
    }

    public Errordisplay(Message ErrorMessage)
    {
        _ErrorMessage = ErrorMessage;
    }    

    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);

        if (_ErrorMessage != null)
        {
            lblTitle.Text = _ErrorMessage.Message;
            lblDescription.Text = _ErrorMessage.Description;
        }
    }
}

在我的Web应用程序的其他地方,我将使用以下代码向用户控件添加一个实例:

divValidationIssues.Controls.Add(LoadControl(typeof(Errordisplay),new object[] { MessageDetails }));

我正在使用LoadControl的重载版本,因为我想将Message参数传递给构造函数.所有这一切似乎都可以正常工作.

但是,当在Errordisplay用户控件上触发OnPreRender()时,lblTitle和lblDescription变量都为空,尽管它们具有等价的标记.消息变量已正确填充.

任何人都可以说明为什么会发生这种情况吗?

谢谢

编辑:

为了清楚起见,我还会补充说,正在编程地将用户控件添加到页面的代码正在响应按钮按钮,所以“主机页面”已经通过Init,Page_Load进行,现在正在处理事件处理程序.

我们无法在早期的asp生命周期阶段添加用户控件,因为它们是响应于按钮单击事件而创建的.

解决方法

我也尝试了以下代码 – 它产生相同的结果(即lblTitle和lblDescription都为null)
protected void Page_Load(object sender,EventArgs e)
{
    if (_ErrorMessage != null)
    {
        lblTitle.Text = _ErrorMessage.Message;
        lblDescription.Text = _ErrorMessage.Description;
    }
}

我了解到,LoadControl函数将控件加载到正在包含的页面的当前“状态”中.因此,Init,Page_Load等都作为LoadControl调用的一部分运行.

有趣的是,这个(未回答)asp.net论坛的帖子展现了与我遇到的相同的问题.

MSDN Forums Post

另外 – 从MSDN:

When you load a control into a container control,the container raises all of the added control’s events until it has caught up to the current event. However,the added control does not catch up with postback data processing. For an added control to participate in postback data processing,including validation,the control must be added in the Init event rather than in the Load event.

所以不要LoadControl正确的控制?

编辑:

好的,所以我在这里回答我自己的问题

我找到一个回复​​版本的论坛帖子,我链接到Here上面

基本上,答案是LoadControl(type,params)不能推断“页面前端”ascx来解析,因此它不会打扰任何控件.当您使用LoadControl(“ascx路径”)版本时,它被赋予页面前端,因此执行所有解析和初始化.

总而言之,我需要更改正在控制的代码,并将其拆分成单独的部分.即

Control ErrorCntrl = LoadControl("Errordisplay.ascx");
ErrorCntrl.ID = SomeID;
(ErrorCntrl as Errordisplay).SetErrorMessage = MessageDetail;
diverrorContainer.Controls.Add(ErrorCntrl);

它应该工作正常..它不像我以前的尝试一样整洁,但至少它会工作.

我仍然乐意提出上述建议.

干杯

ASP.NET UserControl 通信的具体实现

ASP.NET UserControl 通信的具体实现

最近在SharePoint2007中用到了WebPart通信技术,个人觉得2007版本里面的ConnectionConsumer和ConnectionProvider没有2010版本那么好用,于是换了一种思想去实现通信:WebPart容器中装一个UserControl控件,这样只要UserControl可以通信,就实现了WebPart之间通信。

UserControl是用户自定义控件,我们可以在UserControl中注入事件,当一个UserControl触发某种事件,然后通过事件参数来传递数据,让其他UserControl获得这个事件传递过来的参数,实现通信。

下面简单演示一下两个UserControl进行通信

 

创建好一个类,两个UserControl和一个web页面。

这里分别是MyEventAgrs.cs,UCProvider.ascx,UCComsumer.ascx,Default.aspx。

MyEventAgrs.cs代码如下:

复制代码 代码如下:

public delegate void MyEventHandle(object sender, MyEventAgrs args);
    public class MyEventAgrs : EventArgs
    {
        public MyEventAgrs() { }
        public string MyMsg { get; set; }
    }

public delegate void MyEventHandle(object sender, MyEventAgrs args);
    public class MyEventAgrs : EventArgs
    {
        public MyEventAgrs() { }
        public string MyMsg { get; set; }
    }


如果想传递其他对象时就只需要修改MyEventAgrs类的MyMsg方法。这里须继承EventArgs抽象类,用于存放事件参数值,另外需定义一个委托事件,然后在其他的地方使用。

 UCProvider.ascx代码如下:

复制代码 代码如下:

 public partial class UCProvider : System.Web.UI.UserControl
    {
        public event MyEventHandle myHandle;
        protected void Page_Load(object sender, EventArgs e)
        {
            this.DropDownList1.SelectedIndexChanged += new EventHandler(DropDownList1_SelectedIndexChanged);
        }
        void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            MyEventAgrs myEvent = new MyEventAgrs();
            myEvent.MyMsg = DropDownList1.SelectedValue;
            myHandle(this, myEvent);
        }    }

public partial class UCProvider : System.Web.UI.UserControl
    {
        public event MyEventHandle myHandle;
        protected void Page_Load(object sender, EventArgs e)
        {
            this.DropDownList1.SelectedIndexChanged += new EventHandler(DropDownList1_SelectedIndexChanged);
        }
        void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            MyEventAgrs myEvent = new MyEventAgrs();
            myEvent.MyMsg = DropDownList1.SelectedValue;
            myHandle(this, myEvent);
        }    }


这里在前台页面中定义了一个DropDownList,并给DropDownList绑定了数据源,不再罗列前台页面。我想实现当用户选择DropDownList的时候将用户选择的DropDownList的值传递出去,代码里面用myHandle(this, myEvent)来初始化事件。

UCComsumer.ascx代码如下:

复制代码 代码如下:

 public partial class UCComsumer : System.Web.UI.UserControl
    {
public void InitValue(string msg) {
            lb.Text = msg;
        }
}

public partial class UCComsumer : System.Web.UI.UserControl
    {
public void InitValue(string msg) {
            lb.Text = msg;
        }
}


这里赋值的时候也可以用属性来表示,比如:
复制代码 代码如下:

  public string UC1Msg
        {
            get{return this.lb.Text;}
            set{this.lb.Text=value;}
        }

public string UC1Msg
        {
            get{return this.lb.Text;}
            set{this.lb.Text=value;}
        }


如果用这种方式,在引用UserControl的时候就更加方便了:
复制代码 代码如下:

<uc2:ucConsumer runat="server" ID="uc2" UC1Msg="Defalut Value" />

<uc2:ucConsumer runat="server" ID="uc2" UC1Msg="Defalut Value" />


Default.aspx代码如下:

前台页面里面需要注册UserControl

复制代码 代码如下:

<%@ Register TagPrefix="uc1" TagName="ucProvider" Src="~/UserControls/UCProvider.ascx" %>
<%@ Register TagPrefix="uc2" TagName="ucConsumer" Src="~/UserControls/UCComsumer.ascx" %>

<%@ Register TagPrefix="uc1" TagName="ucProvider" Src="~/UserControls/UCProvider.ascx" %>
<%@ Register TagPrefix="uc2" TagName="ucConsumer" Src="~/UserControls/UCComsumer.ascx" %>


再引用

复制代码 代码如下:

<uc1:ucProvider runat="server" ID="uc1" OnmyHandle="uc1_myHandle" />
<uc2:ucConsumer runat="server" ID="uc2" />

<uc1:ucProvider runat="server" ID="uc1" OnmyHandle="uc1_myHandle" />
<uc2:ucConsumer runat="server" ID="uc2" />


后台页面:
复制代码 代码如下:

protected void uc1_myHandle(object sender, MyEventAgrs args)
        {
            if (args != null)
            {
                uc2.InitValue(args.MyMsg);
            }
            else
                uc2.UC1Msg = string.Empty;
        }

protected void uc1_myHandle(object sender, MyEventAgrs args)
        {
            if (args != null)
            {
                uc2.InitValue(args.MyMsg);
            }
            else
                uc2.UC1Msg = string.Empty;
        }


这样就完成了整个过程。Default.aspx页面仅仅是一个载体或者是中间介质,所有的操作都是在两个UserControl之间进行。但是当页面第一次加载的时候,也就是页面加载好过分下拉框没有被点击之前,这里是没有值传递的。

ASP.NET UserControl不初始化子控件

ASP.NET UserControl不初始化子控件

在我的页面中,我有以下内容:
<aspe:UpdatePanel runat="server" ID="updatePanel">
    <ContentTemplate>
        <local:KeywordSelector runat="server" ID="ksKeywords" />
    </ContentTemplate>
</aspe:UpdatePanel>

KeywordSelector控件是我在同一个程序集中定义的控件,局部映射到其命名空间.

控制由其他几个控件组成,其定义如下:

<%@ Control Language="C#" AutoEventWireup="true"
            CodeBehind="KeywordSelector.ascx.cs"
            Inherits="Keywords.KeywordSelector" %>

并拥有自己的很多服务器控件,它们都定义为.designer.cs文件中的成员.

但是,在控件的生命周期的任何部分,它都有任何子控件对象,也不会产生HTML:

> .designer.cs文件中定义的所有成员都为空.
>对HasControls的调用返回false.
>调用EnsureChildControls什么也不做.
>控件集合为空.

删除UpdatePanel没有什么好处.我试图用一个新的UserControl在一个干净的页面中重现它,同样的事情发生.

我使用.NET Framework 3.5 SP1上的ASP.NET与集成的Web服务器.

我在这里缺少什么?

更新#1:在Rob的评论之后,我调查了OnInit,发现UserControl没有检测到它有任何子控件.此外,CreateControlCollection从不被调用!

解决方法

那我发现了这个问题:

>用户控件,而不是自定义控件必须在web.config文件中逐个注册.做这个:

< add tagPrefix =“local”tagName =“KeywordSelector”src =“〜/ KeywordSelector.ascx”/>

代替:

< add tagPrefix =“local”namespace =“关键字”assembly =“关键字”/>
>您不应该将WebControl放在与使用它的控件相同的目录中.这是彻头彻尾的愚蠢. Read about it here.

谢谢您的帮助.现在如果只有我可以把自己的答案标记为答案…

今天关于在PHP中替代ASP.NET的UserControls?php 替代的讲解已经结束,谢谢您的阅读,如果想了解更多关于.net – Masterpage与Usercontrol与Customcontrol之间的区别、Asp.net UserControl LoadControl问题、ASP.NET UserControl 通信的具体实现、ASP.NET UserControl不初始化子控件的相关知识,请在本站搜索。

本文标签: