在 asp.net 中使用 <% ... %> where runat="server" (反之亦然)的解决方案

Solution for use <% ... %> where runat="server" (or vice versa) in 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;
}

关于代码的额外信息: 如果您登录,我会放置一个带有用户 ID 的 cookie。如果 cookie 不为空,则用户已登录,其他方式则不是。如果您正在登录,它会将 ID 为 logouta-标签隐藏。

我的问题

现在这段代码将在第二行给出 NullReferenceException

Additional information: Object reference not set to an instance of an object.

如果我将 runat="server" 放在 a 标签中,它会给我这个:

Server Labels should not contain <% ... %>-constructs.

在上面的代码中的 a 标签上添加了一个 <% ... %> 构造函数,用于获取正确的 url 以转到正确的页面。

这是我的问题。您不能在 runat="server" 所在的位置添加 <% ... %>-构造函数。 怎样做才正确?

其他信息

可能还需要知道我的项目有子目录。例如,从 messages/inbox.aspxuser/profile.aspx 一定很重要。

上面的所有代码都添加到我用于所有页面的母版页。

谁能帮帮我?谢谢,抱歉我的英语不好。

有几种不同的 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>

您可以使用像 Panels or Hyperlinks 这样的 WebForm 控件,而不是使用普通的 a 标签,例如:

<!--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 是否适合您),但会让您能够访问代码隐藏中的控件更容易,例如:

if (Request.Cookies["user"] != null) // log in
{
    logOut.Visible = false; // 2
}
else // log out 
{
    logIn.Visible = false; // 2
    messages.Visible = false;
}