문제

나는 그것을 사용하는 웹 사이트가 있습니다 ASP.NET 로그인 컨트롤 그리고 형태 인증. ASP : LoginStatus 컨트롤을 다른 웹 사용자 컨트롤 내에 배치하여 내 사이트의 헤더 부분 표시를 관리합니다.

내가 가진 문제는 LoginStatus 컨트롤에서 제시 한 returnUrl이 사용자가 현재 켜져있는 페이지가 아니라 헤더 컨트롤 경로를 참조한다는 것입니다. 이것은 아마도 클래스 계층 구조 때문일 수 있으며 헤더 컨트롤 (ASCX)이 실제로 .aspx 파일에서 execute를 사용하여 HTML을 생성하기 때문입니다. 이것은 페이지에 둘 이상의 서버 측 양식을 가질 수없는 문제를 피하기위한 작업입니다.

따라서 페이지의 실제 클래스 계층은 다음과 같습니다.

Default.aspx - Uses Page.Master
Page.Master includes <foo:Header> 
    (with a reference to "~/Controls/Components/Header.ascx")
Header.ascx simply includes an <asp:Literal> 
    on Page_Load performs a Server.Execute ("~/Controls/Pages/Header.aspx") 
    and writes the content out to the Literal
Header.aspx includes <asp:LoginStatus>

사용자가 로그인 링크를 클릭하면 로그인으로 올바르게 리디렉션되지만 ReturnUrl이 표시됩니다 (잘못 - 이유를 이해할 수는 있지만) "ReturnUrl=%2fControls%2fPages%2fHeader.aspx".

로그인 페이지에 올라가면 로그인 이벤트를 매우 행복하게 처리하여 사용자를 올바른 위치로 올바르게 리디렉션 할 수 있습니다. 내가하고 싶은 것은 1) 쿼리 문자열에서 ReturnUrl을 모두 제거합니다.

나는 system.web.ui.webcontrols.loginstatus의 반사기를 수행했으며 다음 코드를 기반으로 ReturnUrl을 항상 사용하는 것이 하드 코딩 된 것으로 보입니다.

private string NavigateUrl
{
    get
    {
        if (!base.DesignMode)
        {
            return FormsAuthentication.GetLoginPage(null, true);
        }
        return "url";
    }
}

항상 ReusereturnUrl을 True로 설정합니다.

아마도 내 유일한 선택은 내 자신의 LoginStatus 컨트롤을 굴리는 것입니까?

편집 : 원래 Brevity를 위해 다음 세부 사항을 생략했습니다.

다음은 내가 성취하려는 내용에 대한 정말 간단한 예입니다.

웹 애플리케이션 프로젝트는 다음과 같은 구조가 있습니다 : 웹 사이트 - 컨트롤 - 구성 요소 - 바닥 글자 -ASCX -HEADER.ASCX- MASTERPAGE- 사이트 .Mas

관심이 있으시면 페이지 마크 업이 아래에 있습니다.

문제의 분리를위한 웹 사용자 컨트롤을 만들었지 만 로그인 페이지에서 ASP : 로그인 컨트롤을 사용하여 (서버 측) 양식으로 중첩해야합니다. ASP : LoginStatus 컨트롤도 (서버 측) 형태로 중첩되어야합니다. 페이지에 둘 이상의 서버 측 양식을 가질 수 없으므로 이렇게합니다.

또한 대답은 로그인 페이지의 LoginStatus 컨트롤을 억제하는 것이 아닙니다. 메인 페이지에 약간의 검색 컨트롤을 추가하고 싶다고 상상해보십시오. 따라서 서버를 사용하고 ASPX에서 페이지를 생성하는 이유입니다. 이 "트릭".NET은 페이지에서 여러 서버 측 양식을 허용합니다. (어떻게 묻지 마 ... 모르겠어요!)

어쩌면 내 아키텍처 디자인 전체가 잘못되었지만 다른 사람들에게 서버 측 양식이 필요한 페이지에 여러 웹 사용자 컨트롤이있는 방법은 무엇입니까? 아니면 그렇지 않습니까?

사이트 마스터 마크 업 :

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="WebSite.MasterPages.Site" %>

<%@ Register TagPrefix="bs" TagName="Footer" Src="~/Controls/Components/Footer.ascx" %>
<%@ Register TagPrefix="bs" TagName="Header" Src="~/Controls/Components/Header.ascx" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
    <asp:ContentPlaceHolder ID="head" runat="server">
    </asp:ContentPlaceHolder>
</head>
<body id="Body" runat="server">
    <div id="container">
        <!-- start header -->
        <bs:Header ID="Header" runat="server" />
        <!-- end header -->
        <div id="central">
            <div id="main">
                <asp:PlaceHolder ID="MainContentPlaceHolder" runat="server">
                    <!-- start main content -->
                    <div>
                        <asp:ContentPlaceHolder ID="MainContent" runat="server" />
                    </div>
                    <!-- end main content -->
                </asp:PlaceHolder>
            </div>
        </div>
        <!-- start footer -->
        <bs:Footer ID="Footer" runat="server" />
        <!-- end footer -->
    </div>

</body>
</html>

default.aspx 마크 업 :

<%@ Page MasterPageFile="~/MasterPages/Site.Master" Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebSite._Default" %>

<asp:Content ID="Content1" runat="server" ContentPlaceHolderID="MainContent">
    Main Body Content <br />
    <br />

</asp:Content>

Header.ASCX 마크 업 :

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Header.ascx.cs" Inherits="WebSite.Controls.Components.Header" %>
<div id="header">
    Header Content <br />
    <div id="loginstatus">
        <form id="Form1" runat="server">
        <asp:LoginView ID="displayloginname" runat="server">
            <AnonymousTemplate>
                <a href="../../Registration.aspx">Register</a>
            </AnonymousTemplate>
            <LoggedInTemplate>
                Welcome
                <asp:LoginName runat="server" ID="ctlLoginName" />
            </LoggedInTemplate>
        </asp:LoginView>
        <asp:LoginStatus ID="displayloginstatus" runat="server" LoginText="Login" LogoutPageUrl="~/Default.aspx"
            LogoutAction="Redirect" />
        </form>

        <br />
    </div>
</div>

바닥 글래스 마크 업 :

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Footer.ascx.cs" Inherits="Website.Controls.Components.Footer" %>

        <div id="footer">
            Footer Content
            <ul class="links">
            <asp:PlaceHolder ID="ListItems" Runat="server">
                <li><a runat="server" id="HomeLink" href="~/">Home</a></li>
                <li><a runat="server" href="~/" ID="A1">About Us</a></li>
                <li><a id="A2" runat="server" href="~/">Contact Us</a></li>
                <li><a id="A3" runat="server" href="~/">Privacy Policy</a></li>
                <li><a id="A4" runat="server" href="~/">Accessibility Policy</a></li>
                <li><a id="A5" runat="server" href="~/">Legal Notices</a></li>
                <li><a id="A6" runat="server" href="~/">Sitemap</a></li>
                <li><a id="A7" runat="server" href="~/">RSS Feeds</a></li>
            </asp:PlaceHolder>
            </ul>

        </div>

Login.aspx 마크 업 :

<%@ Page MasterPageFile="~/MasterPages/Site.Master" Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="Website.Login" %>

<asp:Content ID="Content1" runat="server" ContentPlaceHolderID="MainContent">
    Main Body Content <br />
    <br />
    <form id="form1" runat="server">
    <div>

        <asp:Login ID="Login1" runat="server">
        </asp:Login>

    </div>
    </form>
</asp:Content>
도움이 되었습니까?

해결책

두 가지 옵션이 있습니다.

  1. 양식 태그를 마스터 페이지에 넣으십시오. 바로 아래 <div id="container"> 해당 Div에서 모든 내용을 감싸십시오.
  2. ASP.NET 양식이 필요하지 않도록 헤더를 변경하십시오. LoginView 또는 LoginStatus에 ASP.NET 양식이 필요한지 확실하지 않습니다. 그런 다음 Mas 이것이 내가 선호하는 것은 ASPX 페이지 (마스터 파일이 아님)에만 양식 태그를 넣고 헤더와 바닥 글로 ASP.NET 양식이 필요하지 않은지 확인하는 것입니다 (runat = Server가 아닌 일반 양식 태그를 사용할 수 있음).

다른 팁

Header.ascx에서 Header.aspx의 Execute를 수행하는 이유는 무엇입니까? Header.aspx 코드를 Header.ascx에 넣지 않겠습니까? 그렇게하면 returnUrl이 당신이 기대하는 페이지가 될 것입니다.

여기에서 무언가가 제대로 들리지 않습니다.

on page_load에서 server.Execute를 수행합니다 ( "~/controls/pages/header.aspx")
내용을 문자 그대로 작성합니다

왜 당신 이이 일을하는지 이해하지 못합니까? 당신은 당신이 페이지에서 하나 이상의 htmlform을 허용하지 않는 ASP.net의 문제를 해결하려고하기 때문이라고 언급합니다. 그러나 header.aspx에서 HTML 컨텐츠를 문자 그럴로 넣는 경우 HTMLForm을 사용하지 않습니까? 그렇다면 header.aspx의 내용을 일반 양식 태그에 넣을 수 있습니까 (runat = server없이)? 아니면 로그인 상태 컨트롤을 양식 외부에 전적으로 배치 할 수 있습니까? Header.aspx의 내용이 처음에 형태가 필요합니까?

나는 당신이 당신의 header.aspx 페이지의 내용을 문자 그대로 작성하는지 잘 살펴보고 loginstatus 컨트롤에 뛰어 들어가는 것이 아닌 일을하도록 변경하는 대신 문제를 해결하고 문제를 해결하려고 시도합니다.

또 다른 제안 : 헤더를 문자 그대로로드 해야하는 경우 Page.LoadUserControl을 대신 사용할 수 있습니까? 이것은 자동으로 URL을 해결할 수 있습니까? 그래도 100% 확실하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top