Подтвердить что ты не робот

Установить видимое свойство с тегом сервера <% =%> в Framework 3.5

Я работал в проекте .NET Framework 4, используя теги сервера, такие как <% = whatever% > , чтобы установить видимость элементов управления runat = "server", например:

  <div id="MyId" runat="server" visible="<%=MyVisiblePropertyOnCodeBehind %>" >
    Content
  </div>

Это работает на платформе 4, но теперь, пытаясь использовать это в проекте Framework 3.5, похоже, что это не работает. Является ли это только функцией Framework 4? Есть ли самая крутая (и .aspx сторона) альтернатива настройке видимости от codebehind? Я использую уродливый:

    MiId.Visible = MyVisiblePropertyOnCodeBehind

Спасибо заранее,

Tom

[EDITED] РЕШЕНИЕ:

Спасибо за ваши комментарии, которые заставляют меня понять мою проблему и решение!

Это была моя ошибка не только в одном.

В проекте VS2010 мы использовали <% # вместо <% =

Кроме того, я не заметил, что в проекте VS2010 мы использовали страницы, унаследованные не от "Страница", а из класса CustomPage, который автоматически привязывал привязку, не заметив этого, и это заставляет меня думать, что это было Framework 4.0.

Как вы сказали здесь, если у вас есть следующая разметка:

  <div id="MyId" runat="server" visible="<%# MyVisiblePropertyOnCodeBehind %>" >
    Content
  </div>

вы можете заставить его работать, добавив следующее в codebehind:

    public bool  MyVisiblePropertyOnCodeBehind = true;
    protected void Page_Load(object sender, EventArgs e) {
        DataBind();
        // Or if you want only for one control, MyId.DataBind();             
    }

Как я читал, этот DataBind() может снизить производительность приложения. У вас есть представление о том, сколько? Можно ли это понимать как "профессиональную" технику, которая будет использоваться в крупных проектах, или вы думаете, что ее следует избегать?

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

4b9b3361

Ответ 1

Выведенный код не является допустимым синтаксисом для тегов сервера в среде выполнения ASP.NET 2.0 или ASP.NET 4.0. В любой из версий попытка установить видимое свойство с помощью <%= ... %> в теге сервера должна привести к ошибке парсера:

Сообщение об ошибке Parser: невозможно создать объект типа "System.Boolean" из его строкового представления '<% = MyVisiblePropertyOnCodeBehind% > ' для свойства "Видимый".

У вас есть два параметра, кроме как установить свойство Visible в коде или теге <script runat="server">. Первый заключается в использовании привязки данных в свойстве Visible. Вам нужно вызвать метод DataBind() либо на MyId, либо на один из его родительских элементов управления для связанного значения.

<div id="MyId" runat="server" visible="<%# MyVisiblePropertyOnCodeBehind %>" >
    Content
</div>

Другой вариант - записать код следующим образом:

<% if(MyVisiblePropertyOnCodeBehind) { %>
<div id="MyId" runat="server">
    Content
</div>
<% } %>

Недостатком такого подхода является то, что вы не сможете программно добавлять элементы управления на страницу или элемент управления, который содержит блоки кода. Если вы попытаетесь, вы должны получить сообщение об ошибке:

Коллекция элементов управления не может быть изменена, поскольку элемент управления содержит кодовые блоки (то есть <%...% > )

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

Ответ 2

Как для встроенного выражения ASP.NET aspx. <%% > может использоваться только при aspx page или пользовательский уровень верхнего уровня документа, но не может быть внедрен в атрибут тега управления сервером (например, <asp:Button... Text =<% %> ..>). Как вы нашли, вы можете создать собственный построитель выражений в ASP.NET 2.0 для добавьте свое встроенное выражение.

BTW, еще одно средство для предоставления значений свойствам управления сервером в aspx inline tempalte использует выражение <% #% > привязки данных. Это встроенный. Единственное отличие от других встроенных выражений состоит в том, что метод на целевом элементе управления или его управление контейнером.

Стивен Ченг

Подчиненная поддержка Microsoft MSDN

Полное сообщение здесь: http://www.aspnet-answers.com/microsoft/ASP-NET/29389067/dynamically-set-a-control-property.aspx

И обходной путь здесь: ASP.NET Inline Expression Issue

Ответ 3

Просто установите переменную в true/false для вашего события на страницеLoad, например,

private bool IsEditMode {get; set;}      

protected bool IsVisible 
{
    get { retun IsEditMode ;}
    set { IsEditMode =value;}
}  

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        // based on some condition set this to true or false 
        isEditMode=true;
    }
}   

Затем в ваших свойствах управления внутри страницы aspx установите их видимость с помощью свойства типа

Visible="<%# !IsEditMode %>" 

Ответ 4

Вот еще один подход, который поддерживает простоту кода из вашего исходного вопроса. Здесь вам нужно будет удалить runat = "server" из тега div и использовать css "display: none" вместо свойства "Visible". Недостатком этого подхода является то, что тег по-прежнему отправляется в браузер, даже если он не отображается и видимость обрабатывается на стороне клиента.

<div style='<%=MyVisiblePropertyOnCodeBehind ? "" : "display: none" %>' >
    Content
</div>