#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.
я хочу передать список объектов, а не строку.