Установите свойство Visible с тегом сервера <% =%> в Framework 3.5 - PullRequest
52 голосов
/ 07 марта 2012

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

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

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

    MiId.Visible = MyVisiblePropertyOnCodeBehind

Заранее спасибо,

Tom

[РЕДАКТИРОВАНИЕ] РЕШЕНИЕ:

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

Это была моя вина во многих вещах.

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

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

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

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

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

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

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

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

Ответы [ 4 ]

74 голосов
/ 07 марта 2012

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

Сообщение об ошибке синтаксического анализатора: не удается создать объект типа 'System.Boolean' изего строковое представление '<% = MyVisiblePropertyOnCodeBehind%>' для свойства 'Visible'.

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

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

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

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

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

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

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

3 голосов
/ 07 марта 2012

Просто установите переменную в значение true / false для вашего события pageLoad, как это

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 %>" 
3 голосов
/ 07 марта 2012

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

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

Стивен Ченг

Руководство по онлайн-поддержке Microsoft MSDN

Полный пост здесь: http://www.aspnet -answers.com / microsoft / ASP-NET / 29389067 / dynamic-set-a-control-property.aspx

И обходной путь здесь: Проблема встроенного выражения ASP.net

1 голос
/ 22 октября 2013

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

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