将对象传递到转发器中的UserControl? .Net 1

时间:2009-07-24 12:49:50

标签: .net asp.net vb.net user-controls .net-1.1

我想在用户控件中包含一大块HTML呈现逻辑。然后我想将一个自定义产品对象(标题,缩略图,ID等)传递给它在呈现时可以使用的UserControl。理想情况下,我想在转发器(或循环)中使用它,并将当前的自定义产品对象传递到UC中。

我见过的每个例子都是通过UC标签上的字符串,但这并不是我想要做的,因为这意味着如果我们添加一个需要渲染的新字段,我会在任何需要更新的地方引用。< / p>

有什么想法吗?

.Net 1使用VB.net(不是我对.net的首选,所以很容易)

HTML示例让我们开始,这将在.ascx页面中:

<div>
  <h3><%= myProd.title %></h3>
  <img src="<%= myProd.thumbnail %>" />
  <p>
    <%= myProd.description %>
  </p>
</div>

更新:

好的,这里有一些黑客攻击是我想出来的,虽然不起作用,但这个难题的缺失是什么?

创建一个UserControl并将其添加到后面的代码中:

Public Class ProductRender
    Inherits System.Web.UI.UserControl

#Region " Web Form Designer Generated Code "

    'This call is required by the Web Form Designer.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

    End Sub

    'NOTE: The following placeholder declaration is required by the Web Form Designer.
    'Do not delete or move it.
    Private designerPlaceholderDeclaration As System.Object

    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
        'CODEGEN: This method call is required by the Web Form Designer
        'Do not modify it using the code editor.
        InitializeComponent()
    End Sub

#End Region

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Put user code to initialize the page here
    End Sub

    Private _product As productItem 

    Public Property myProd() As productItem 
        Get
            myProd = Me._product
        End Get
        Set(ByVal Value As productItem )
            Me._product = Value
        End Set
    End Property
End Class

在UC ascx页面中我只有上面的html。

在使用UC的页面中,我只需添加以下内容进行测试:

...usual ascx header stuff...
<%@ Register TagPrefix="ORC" TagName="productRender" Src="productRender.ascx" %>
<ORC:productRender id="Assetrender1" runat="server" asset="<%# getDummyProduct() %>" />

在后面的代码中我将getDummyProduct声明为:

Public Function getDummyProduct() As productItem
    getDummyProduct = New productItem( "DVD Player", "It plays DVDs!", "some_thumb.jpg", 30 )
End Function

然而在我的ascs页面中,我得到:“对象引用没有设置为对象的实例”

Line 1:  <%@ Control Language="vb" AutoEventWireup="false" Codebehind="ProductRender.ascx.vb" Inherits="MyApp.ProductRender" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %>
Line 2:  <h3>
Line 3:  <%= myProd.title %>
Line 4:  </h3>

2 个答案:

答案 0 :(得分:2)

我可以想到几种方法。

我首先询问你是否曾经做过嵌套转发器。如果没有,那就从那里开始,以便我接下来要说的下一件事情是有道理的。 (这是你需要先获得的概念。)

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

您可以创建用户控件以使其可以数据绑定,并使用嵌套转发器中的概念来对此控件进行数据绑定。

另一个可行的选择是使用转发器的ItemDataBound事件在代码隐藏中添加控件。

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.itemdatabound.aspx

第三个选项是创建一个服务器端函数并在ItemTemplate中对它进行方法调用

<ItemTemplate>
     <%# DisplayProduct(DataBinder.Eval(Container,"DataItem.ProductId")) %>
</ItemTemplate>

...

Public Function DisplayProduct(ByVal ProductID as Integer) AS String
... logic goes here
End Function

这三个都有效,每个都有利弊。第一种选择可能是最“适当”的,但你会想做一些你觉得舒服的事情。就个人而言,我会尝试所有三个并看看哪个表现更好。

------------已添加--------------------

我明白了...我认为我的措辞可能令人困惑......

我正在考虑的是让ascx LOOK像数据绑定控件......

我过去所做的是创建一个userControl并在其中公开一个公共属性。

从ASCX背后的代码(如果VB语法关闭,请原谅我......几年没用VB了):

Dim _RecordID as Integer = 0

Public Property RecordId
     Get
       Return _RecordID
     End Get
     Set(ByVal Calue as Integer)
       _RecordID = Value
     End Set
   End Property

和ascx的Page_Load事件中,使用RecordID属性将代码加载到数据中,就像任何aspx页一样。

然后在HOSTS ASCX文件的页面上

<%@ Register TagPrefix= = "dds"   TagName="ProductControl" ....  %>
    <ItemTemplate>
         <dds:ProductControl RecordId = '<%# (DataBinder.Eval(Container,"DataItem.ProductId")) %>'
    </ItemTemplate>

答案 1 :(得分:0)

拍前额

需要在Page.OnLoad中调用DataBind才能使数据绑定工作,这就解释了为什么我找不到Object!