Передать объект в UserControl в повторителе? .Net 1 - PullRequest
0 голосов
/ 24 июля 2009

Я хочу обернуть кусок HTML-логики рендеринга в пользовательский элемент управления. Затем я хочу передать пользовательский объект продукта (заголовок, эскиз, идентификатор и т. Д.) В UserControl, который он может использовать при рендеринге. В идеале я хочу использовать это в повторителе (или для цикла) и передать текущий пользовательский объект продукта в UC.

Каждый пример, который я видел, проходил через строки в теге UC, но это не совсем так. хочу, я хочу сделать так, как это означает, что у меня везде будут ссылки, которые требуют обновления, если мы добавим новое поле, требующее рендеринга.

Есть идеи?

.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 ]

2 голосов
/ 24 июля 2009

Я могу придумать несколько подходов.

Я бы начал с вопроса, делали ли вы когда-нибудь вложенные повторители. Если нет, начните с того, что следующая вещь, которую я собираюсь сказать, имеет смысл. (Это концепция, которую вы должны получить в первую очередь.)

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

и в Page_LoadСобытие ascx, поместите свой код для загрузки данных, как и любую страницу aspx, используя свойство RecordID.

Затем на странице, на которой находится файл ASCX

<%@ Register TagPrefix= = "dds"   TagName="ProductControl" ....  %>
    <ItemTemplate>
         <dds:ProductControl RecordId = '<%# (DataBinder.Eval(Container,"DataItem.ProductId")) %>'
    </ItemTemplate>
0 голосов
/ 24 июля 2009

Хлопает по лбу

Нужно вызвать DataBind в Page.OnLoad для работы привязки данных, которая объясняет, почему я получаю Объект не найден!

...