使用解决方案<%...%>其中runat =“server”(或反之亦然)在asp.net

时间:2015-06-17 14:42:55

标签: c# asp.net runatserver

我的想法

当用户用他的头像点击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不为null,则用户登录,其他方式不是。如果您是登录信息,则会将标识为a的{​​{1}} - 标记置于不可见状态。

我的问题

现在,此代码将在第二行提供logout

  

附加信息:未将对象引用设置为对象的实例。

如果我将NullReferenceException放在runat="server" - 标签上,它就会给我这个:

  

服务器标签不应包含a - 构造。

上面的代码中的<% ... %>标记上添加了<% ... %> - 构造函数,以获取正确的网址以获取正确的网址。

这是我的问题。您无法在a站点的位置添加<% ... %> - 构造函数。 你怎么能以正确的方式做到这一点?

其他信息

也许重要的是要知道我的项目有子目录。例如,从runat="server"messages/inbox.aspx一定很重要。

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

任何人都可以帮助我吗?谢谢,抱歉我的英语不好。

3 个答案:

答案 0 :(得分:2)

您可以使用PanelsHyperlinks之类的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是否适合您),但是可以让您更轻松地访问Code中的控件,例如:< / p>

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

答案 1 :(得分:1)

ASP.net内联标签有几种不同的类型。请在此处查看完整列表:https://support.microsoft.com/en-us/kb/976112

并非所有这些都支持在服务器端控件标记的属性中放置。 <%# ... %>数据绑定表达式内联格式允许您这样做,我也认为较旧的<% ... %>格式。 <%= ... %>内联标记肯定在服务器端控件标记内工作,因为整个表达式是直接编译的,而不是将内容显示为属性值。

如果您的主要目标是控制服务器端控件的可见性,那么您应该只能在代码隐藏中设置control.Visible = false;。如果您想控制非服务器端控件(或控件块)的可见性,那么<asp:Panel>服务器端控件可能是您的最佳路径。 ASP.net试图摆脱旧ASP的过度内联方法。

答案 2 :(得分:-1)

我曾经遇到类似你指定的错误。由于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>