我想在用户控件中包含一大块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>
答案 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!