Как привязать локальную переменную к базе данных в шаблоне ASPX?

#asp.net #.net #vb.net #data-binding

Вопрос:

У меня есть пользовательский элемент управления с именем SlidingScaleTableReadonly с привязываемым открытым членом ScaleEntries , который содержит список экземпляров структуры. На родительской странице эти списки хранятся в словаре ( InsulinSlidingScaleProtocolEntries ), и я должен отображать их SlidingScaleTableReadonly для каждой записи в этом словаре. Вот мой код шаблона на данный момент:

 <%@ Register TagPrefix="uc" TagName="SlidingScaleTableReadonly"  Src="~/Patient/SlidingScaleTableReadonly.ascx" %>

<asp:Content ContentPlaceHolderID="phContent" runat="server">
    <h1>Échelles</h1>
    <% For Each drug In InsulinSlidingScaleProtocolEntries %>
        <h2><%= drug.Key %></h2>
        <uc:SlidingScaleTableReadonly runat="server" ScaleEntries="<%# drug.Value %>" />
    <% Next %>
</asp:Content>
 

Моя проблема в строке 7:

BC30451 «препарат» не заявлен. Он может быть недоступен из-за его уровня защиты.

Если я drug.Value заменю свойство, доступное в коде, то можно будет найти новую переменную. Я предполагаю, что невозможно напрямую привязать локальные переменные к данным в ASPX? Если это так, как я могу использовать привязку данных внутри итерации?

Изменить — Изменение происхождения связанного значения

Я немного изменил код. Сразу после открытия цикла «Для каждого» названному свойству с кодом CurrentDrug присваивается значение drug.Value , и uc:SlidingScaleTableReadonly оно ScaleEntry получается из этого нового свойства. Но это тоже не работает, переназначение не сработает и ScaleEntry всегда Nothing (или независимо от того, какое начальное значение я дал CurrentDrug ).

Вот новый шаблон:

 <%@ Register TagPrefix="uc" TagName="SlidingScaleTableReadonly"  Src="~/Patient/SlidingScaleTableReadonly.ascx" %>

<asp:Content ContentPlaceHolderID="phContent" runat="server">
    <h1>Échelles</h1>
    <% For Each drug In InsulinSlidingScaleProtocolEntries
        CurrentDrug = drug.Value %>
        <h2><%= drug.Key %></h2>
        <uc:SlidingScaleTableReadonly runat="server" ScaleEntries="<%# CurrentDrug  %>" />
    <% Next %>
</asp:Content>
 

И код-за:

 Public CurrentDrug As List(Of ScaleEntry)

Public Property InsulinSlidingScaleProtocolEntries As Dictionary(Of String, List(Of ScaleEntry))
    '...
End Property
 

Изменить — (Не) решение: Перестал использовать шаблоны aspx

Мне нужно двигаться дальше, и, похоже, я не собираюсь прогрессировать с шаблонами aspx. Я переписал страницу, чтобы пользовательский элемент управления был объявлен и вставлен в код. Я думаю, что это не то, как нужно создавать интерфейс, это не то, где должна быть такая логика, но я действительно хочу двигаться дальше.

Вот новый код шаблона:

 <asp:Content ContentPlaceHolderID="phContent" runat="server">
    <h1>Échelles</h1>
    <div id="scaleContainer" runat="server"></div>
</asp:Content>
 

Код-за:

 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    For Each prescription In InsulinSlidingScaleProtocolEntries
        Dim label As New HtmlGenericControl("h2") With {
            .InnerText = prescription.Key
        }

        Dim table = CType(Page.LoadControl("~/Patient/SlidingScaleTableReadonly.ascx"), SlidingScaleTableReadonly)
        table.ScaleEntries = prescription.Value

        scaleContainer.Controls.Add(label)
        scaleContainer.Controls.Add(table)
    Next
End Sub
 

Если у вас есть лучшее решение, я буду рад его увидеть.

Комментарии:

1. %# предназначен ТОЛЬКО для события привязки/привязки данных и для получения данных из события источник данных привязка данных . вы можете попробовать <% %> так же, как и для другого кода.

2. @AlbertD.Kallal При этом выдает следующую ошибку: Cannot create an object of type '(...)' from its string representation '<% drug.Value %>' for the 'ScaleEntries' property. я хочу передать список объектов, а не строку.