簡體   English   中英

使用<%…%>的解決方案,其中asp.net中的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不為null,則表明用戶正在登錄,而其他方式則不是。 如果您是登錄用戶,則它將ID logout a -tag置於不可見狀態。

我的問題

現在,此代碼將在第二行給出NullReferenceException

附加信息:對象引用未設置為對象的實例。

如果我把runat="server"a標簽都有效,它給我這個:

服務器標簽不應包含<% ... %> -constructs。

在上面的代碼a -tag上添加了<% ... %> -constructor,以獲取正確的URL進入正確的頁面。

這是我的問題。 您不能在runat="server"所在的位置添加<% ... %> -constructor。 您如何才能正確地做到這一點?

其他資訊

也許還重要的是要知道我的項目有子目錄。 例如,從messages/inbox.aspx轉到user/profile.aspx必須很重要。

上面所有這些代碼都添加到了我用於所有頁面的母版頁中。

誰能幫我? 謝謝,抱歉我的英語不好。

除了使用普通a -tags之外,還可以使用PanelHyperlinks之類的WebForm控件,例如:

<!--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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM