2011-07-26 53 views
0

最近我处理了一个商业可用的ASP.NET产品,该产品应该未命名。当在代码中闲逛,我注意到,有用户控件铸造,看起来像这样:Casting UserControl ASP.control_name_ascx vs Control_Name - 优点/缺点?

Dim ctl As ASP.modules_controls_addressinput_ascx = DirectCast(Me.FindControl("AddressInput1"), ASP.modules_controls_addressinput_ascx) 

最近我需要投一个usercontrol其特定的类型,我自己的一个项目,所以我可以访问它的公共属性,自然我从上面复制了铸造方法,因为我还没有看到另一种方法来做到这一点。

但是,当使用此类型的投射部署项目时,它会“构建”,但在尝试“发布”错误“未知类型”时失败。一些修修补补后,我意识到,声明类将工作作为类型如下:

Dim ctl As Modules_Controls_AddressInput = DirectCast(Me.FindControl("AddressInput1"), Modules_Controls_AddressInput) 

当用户控件声明如下其ascx.vb文件:

Partial Class Modules_Controls_AddressInput 
    Inherits System.Web.UI.UserControl 

事实上,这也通过发布解决了这个问题。

我的问题是什么会迫使别人投第一种方式,第二种方式,特别是当它意味着发布项目会失败?

回答

2

我不确定,但第一种方法会将您的控件强制转换为asp.net临时文件夹中的编译代码C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files \ ProjectName但第二种方法会将其转换为类本身。在我的工作,我通常使用LoadControl("UserControlPath")创建任何用户控制

Dim ctrl As MyControl = CType(Page.LoadControl("MyControl.ascx"), MyControl) 
ctrl.Property1 = value1 
ctrl.Property2 = value2 

有关ASP.Net你可以参考这篇文章http://msdn.microsoft.com/en-us/library/ms972975.aspx

+0

感谢您的链接的用户控件的更多进一步的信息的一个实例。 +1,因为它解释说这是引用了ASP.NET的临时文件夹,但你真的没有回答为什么有人愿意这样做,而不是将其转换为类本身。 – NightOwl888