海妖 发表于 2015-1-16 14:22:22

来一篇关于NET的静态增加用户控件后没有初始化属性的成绩剖析

我之所以想学。NET,是因为一直觉的BILLGATES好厉害,希望有一天能去微软,虽然现在还距离遥远,呵呵:)明天在asp.net背景经由过程Page.LoadControl办法增加用户控件后,发明用户控件中的OnInit中的事务没有实行,我们先看看我的用户控件中触及该成绩的代码:
///<summary>
///SDDropDownList范例,控件可依据之范例主动初始化下拉项
///</summary>
public_SourceTypeSourceType
{
get;
set;
}

protectedoverridevoidOnInit(EventArgse)
{
base.OnInit(e);
if(!IsPostBack)
{
DataBind_LocalDDL(SourceType);
}
}

publicvoidDataBind_LocalDDL(_SourceType_SourceType)
{
switch(_SourceType)
{
case_SourceType.Storage_Goods_Sort:
{
DDLDataBind(droplist,DictionaryBLL.GetModelList("DCID=002"));
break;
}
case_SourceType.Storage_Goods_GState:
{
DDLDataBind(droplist,DictionaryBLL.GetModelList("DCID=032"));
break;
}
……
}

privatevoidDDLDataBind(System.Web.UI.WebControls.DropDownListDDL,List<SDERP.Model.SysManage.Sys_Dictionary>DataSource)
{
ListItemItem=newListItem("--请选择--","");
DDL.DataValueField="DID";
DDL.DataTextField="Dname";
DDL.DataSource=DataSource;
DDL.DataBind();
DDL.Items.Insert(0,Item);
}


再看看我挪用页面中触及该成绩的代码:
protectedoverridevoidPage_Load(objectsender,EventArgse)
{
base.Page_Load(sender,e);
InitSearchPanel();
}

protectedvirtualvoidInitSearchPanel()
{
……
IControlsicontrols=(IControls)Page.LoadControl("~/Controls/SDDropDownList.ascx");
SDDropDownListiicontrol=icontrolsasSDDropDownList;
if(icontrols!=null)
{
SearchPanelID.Controls.Add(iicontrol);
if(!string.IsNullOrEmpty(dr["ControlSourceID"].ToString()))
{
iicontrol.SourceType=(Controls._SourceType)Enum.Parse(typeof(Controls._SourceType),dr["ControlSourceID"].ToString());
}
……
}
}


经反省后发明,成绩出在SearchPanelID.Controls.Add(iicontrol)这行代码中,在asp.net中,在背景静态增加的用户控件,其初始化事情是在用户控件被增加到页面上入手下手的,而不是在加载时入手下手。也就是说,我的用户控件在SearchPanelID.Controls.Add(iicontrol)这行代码后即刻入手下手初始化事情,也就是实行用户控件的OnInit办法,而在此时,用户控件的SourceType属性并没有赋值,也就是值为None,以是用户控件的DataBind_LocalDDL事务中,就不克不及为droplist主动加添下拉项了。

改写代码,将
if(!string.IsNullOrEmpty(dr["ControlSourceID"].ToString()))
{
iicontrol.SourceType=(Controls._SourceType)Enum.Parse(typeof(Controls._SourceType),dr["ControlSourceID"].ToString());
}
这段代码移到SearchPanelID.Controls.Add(iicontrol)之前,成绩办理。也就是:
protectedvirtualvoidInitSearchPanel()
{
……
IControlsicontrols=(IControls)Page.LoadControl("~/Controls/SDDropDownList.ascx");
SDDropDownListiicontrol=icontrolsasSDDropDownList;
if(icontrols!=null)
{
if(!string.IsNullOrEmpty(dr["ControlSourceID"].ToString()))
{
iicontrol.SourceType=(Controls._SourceType)Enum.Parse(typeof(Controls._SourceType),dr["ControlSourceID"].ToString());
}
SearchPanelID.Controls.Add(iicontrol);
……
}
}


总结:
1,我们在asp.net背景中静态增加用户控件时,在Page.LoadControl("控件地点")加载控件的时分,用户控件未被初始化,只要当用户控件增加到页面元素中时,才会入手下手初始化.
2,我们在开辟WebForm项目时,必定要分明懂得页面和控件的性命周期,才干在庞大的逻辑处置中做到不堕落。在经过全球个人PC市场占有90%的微软对asp.net不断优化与整合后,asp.net与微软自身平台的动用上更加的高效,加上asp.net在应用上非常容易上手,相信asp.net仍会是最多客户选用的脚本语言,并会在未来几年继续领跑。

山那边是海 发表于 2015-1-18 13:42:51

主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。

第二个灵魂 发表于 2015-1-25 08:40:22

但是目前在CGI中使用的最为广泛的是Perl语言。所以,狭义上所指的CGI程序一般都是指Perl程序,一般CGI程序的后缀都是.pl或者.cgi。

冷月葬花魂 发表于 2015-2-2 19:37:07

PHP的源代码完全公开,在OpenSource意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函数库加入,以及不停地更新,使得PHP无论在UNIX或是Win32的平台上都可以有更多新的功能。它提供丰富的函数,使得在程式设计方面有着更好的资源。目前PHP的最新版本为4.1.1,它可以在Win32以及UNIX/Linux等几乎所有的平台上良好工作。PHP在4.0版后使用了全新的Zend引擎,其在最佳化之后的效率,比较传统CGI或者ASP等技术有了更好的表现。

分手快乐 发表于 2015-2-8 05:25:54

市场决定一切,我个人从经历上觉得两者至少在很长时间内还是要共存下去,包括C和C++,至少从找工作就看得出来,总不可能大家都像所谓的时尚一样,追捧一门语言并应用它。

乐观 发表于 2015-2-24 17:59:09

Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。

小女巫 发表于 2015-3-7 13:33:11

微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。

活着的死人 发表于 2015-3-15 07:30:41

ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp)。

飘飘悠悠 发表于 2015-3-21 23:16:35

ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。
页: [1]
查看完整版本: 来一篇关于NET的静态增加用户控件后没有初始化属性的成绩剖析