Решение для использования <%...%>, где runat="server" (или наоборот) в asp.net
Моя идея
Когда пользователь нажимает на a
тег с его аватаром, он должен перенаправить на другую страницу. Я делаю это с кодом под номером один (см. Ниже).
<div>
<!--show new messages | only show when log in. -->
<a href="<%=ResolveUrl("~/messages/inbox.aspx") %>" class="click headeritem" id="messages">
<img src="<%=ResolveUrl("~/images/message.png") %>" alt="new messages" id="messages" />
<asp:Label class="number" id="lblNewMessages" runat="server">1</asp:Label>
</a>
<!--log in | only show when log out. -->
<div class="user" id="logOut" runat="server">
<a href="<%=ResolveUrl("~/gebruikers/aanmelden.aspx") %>" class="click" id="logIn">Log in</a>
<a href="<%=ResolveUrl("~/gebruikers/registreren.aspx") %>" class="click" id="regist" style="left:100px">Regist</a>
</div>
<!--go to the profile of the user | only show when log in. -->
<!--1-->
<a class="click user" id="logIn" href="<%=ResolveUrl("~/gebruiker.aspx") %>">
<img id="picture" src="<%=ResolveUrl("~/afbeeldingen/person-male.png") %>" alt="user" />
<asp:Label runat="server" id="points" class="points">10</asp:Label>
</a>
</div>
С помощью этого кода C# я размещаю некоторые теги невидимыми в зависимости от входа или выхода.
if (Request.Cookies["user"] != null) // log in
{
FindControl("logOut").Visible = false; // 2
}
else // log out
{
FindControl("logIn").Visible = false; // 2
FindControl("messages").Visible = false;
}
Дополнительная информация о коде: Если вы входите в систему, я размещаю куки с идентификатором пользователя. Если cookie не нулевой, пользователь входит в систему, другими способами нет. Если вы вошли в систему, поместите a
-тег с идентификатором logout
незаметный.
Моя проблема
Теперь этот код даст NullReferenceException
на второй линии.
Дополнительная информация: Ссылка на объект не установлена для экземпляра объекта.
Если я размещу runat="server"
к a
-Tag, это даст мне это:
Метки сервера не должны содержать
<% ... %>
-конструкты.
Есть <% ... %>
-строитель добавлен на a
-Tag в коде выше, чтобы получить правильный URL-адрес, чтобы перейти на нужную страницу.
Это моя проблема. Вы не можете добавить <% ... %>
-строитель где runat="server"
стоять. Как вы можете сделать это правильно?
Дополнительная информация
Возможно также важно знать, что у моего проекта есть подкаталоги. Должно быть важно идти от messages/inbox.aspx
в user/profile.aspx
например,
Весь этот код выше добавлен на главную страницу, которую я использую для всех страниц.
Может кто-нибудь мне помочь? Спасибо и извините за мой плохой английский.
3 ответа
Вместо того, чтобы использовать простой a
-tags, вы можете использовать элементы управления WebForm, такие как Panels или Hyperlinks, например:
<!--log in | only show when log out. -->
<asp:Panel CssClass="user" id="logOut" runat="server">
<asp:HyperLink NavigateUrl="~/gebruikers/aanmelden.aspx" CssClass="click" id="logIn" Text="Log in" runat="server" />
<asp:HyperLink NavigateUrl="~/gebruikers/registreren.aspx" CssClass="click" id="regist" style="left:100px" Text="Regist" runat="server"/>
</asp:Panel>
Это может уменьшить степень контроля над сгенерированным HTML (поэтому вам нужно будет проверить, подходит ли вам HTML), но позволит вам более легко получить доступ к элементам управления в Code, например:
if (Request.Cookies["user"] != null) // log in
{
logOut.Visible = false; // 2
}
else // log out
{
logIn.Visible = false; // 2
messages.Visible = false;
}
Существует несколько разновидностей встроенных тегов ASP.net. Пожалуйста, посмотрите полный список здесь: https://support.microsoft.com/en-us/kb/976112
Не все они поддерживают размещение внутри атрибутов тега серверного элемента управления. <%# ... %>
встроенный формат выражения привязки данных позволит вам сделать это, и я думаю, что старше <% ... %>
формат тоже. <%= ... %>
Встроенный тег определенно не будет работать внутри серверного тега управления, поскольку все выражение компилируется напрямую, а не отображает содержимое в качестве значения атрибута.
Если вашей главной целью является управление видимостью серверного элемента управления, то вы должны просто иметь возможность установить control.Visible = false;
в вашем коде позади. Если вы хотите контролировать видимость элемента управления не на стороне сервера (или блока элементов управления), то <asp:Panel>
серверный контроль может быть вашим лучшим маршрутом. ASP.net пытался отойти от чрезмерного встраивания подхода старого ASP.
Раньше я получал ошибки, похожие на ту, которую вы указали. Поскольку ResolveUrl
использования ""
избегайте использовать это для HREF
Атрибут тоже может нарушить код. Попробуйте следующий код:
<a href='<%=ResolveUrl("~/messages/inbox.aspx") %>' class="click headeritem" id="messages">
<img src="<%=ResolveUrl("~/images/message.png") %>" alt="new messages" id="messages" />
<asp:Label class="number" id="lblNewMessages" runat="server">1</asp:Label>
</a>