Решение для использования <%...%>, где 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>
Другие вопросы по тегам