Создайте переменную в области привязки данных - PullRequest
2 голосов
/ 05 мая 2011

Я привязываю данные к повторителю и хотел бы получить доступ к переменной в шаблонах кода проекта.Переменная будет содержать некоторую информацию для последующего использования в действии привязки данных.
В идеале область действия переменной должна быть ограничена «действием связывания данных».Я мог бы просто использовать глобальную переменную, но эй, это было бы обманом!

Я пытался использовать блок сценария для определения переменной, но это не работает;переменная создается вне области действия шаблонов повторителя.

<% bool x; %>
<asp:Repeater ID="suggestionRepeater" runat="server">
   <ItemTemplate>
      <%# x = false %>  // x does not exist in current context
   </ItemTemplate>
</asp:Repeater>


<asp:Repeater ID="suggestionRepeater" runat="server">
   <HeaderTemplate>
       <% bool x; %>
   </HeaderTemplate>
   <ItemTemplate>
       <%# x = false %>  // x does not exist in current context
   </ItemTemplate>
</asp:Repeater>

Так возможно ли это без использования простого маршрута и использования глобальной (или защищенной) переменной?

Ответы [ 3 ]

1 голос
/ 05 мая 2011

Я думаю, что вы не можете.Во всяком случае, не в разметке.Вы можете использовать скрытое поле в качестве другого ответа, сказанного (Обновление: другой парень удалил его позже!) , и я обычно, когда делаю такое, устанавливаю видимым false и viewstate false, но эй, зачем вообще это нужно?..

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

Но, опять же, возможно, вы пытаетесь решить не ту проблему!Помните, что это .NET, а не C ++.Даже если переменная находится вне области видимости, она будет собираться только при необходимости.Даже для объекта типа значения, насколько большим он может быть?
Кроме того, сколько времени длится весь жизненный цикл страницы по сравнению с ретранслятором?

Если объект действительно «такой« дорогой, и вы »на самом деле «знайте в цифрах вескую причину, по которой вы не хотите, чтобы он работал дольше, чем привязка данных, тогда это также должен быть одноразовый объект (чтобы гарантировать надлежащую очистку ресурса), и тогда я мог бы сделать что-то вроде:

protected MyObjectType MyObject;

protected void BindRepeater(IEnumerable someDataSource)
{
    using(MyObject = SomeClass.SomeMethodToGetObject())
    {
        myRepeater.DataSource = someDataSource;
        myRepeater.DataBind();
    }
}

Здесь using должен гарантировать очистку путем неявного вызова Dispose().Конечно, он все еще грязный, так как кто-то может ошибиться и использовать MyObject в другом месте, когда он удаляется или не назначается, даже если я размещаю комментарии и все такое, и в конце концов это глобальная переменная - да, это обман или работа-ограниченное ограничение.

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

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

1 голос
/ 05 мая 2011

Хм, а как насчет использования функции и вызова ее в блоке скрипта?

<%# SetMyBool(Eval("RowID")) %>  

И определить bool в этой функции?или вернуть логическое значение, если хотите?

0 голосов
/ 05 августа 2016
<script language="VB" runat="Server"> 
        Dim rez As String
        public Function SetMyBool(v as string) As String
        rez=v
        End Function
</script>




<asp:Repeater runat="server" DataSourceID="dsRateSet">
<ItemTemplate>
<%# SetMyBool(Eval("result")) %>
</ItemTemplate>
</asp:Repeater>

<% =rez %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...