ASP.NET LoginStatus التحكم - تجاوز ReturnURL في إنشاء QueryString

StackOverflow https://stackoverflow.com/questions/1004630

  •  05-07-2019
  •  | 
  •  

سؤال

لدي موقع على شبكة الانترنت يستخدم ASP.NET ضوابط تسجيل الدخول و مصادقة النماذج.لقد وضعت asp:LoginStatus التحكم داخل آخر تحكم مستخدم ويب التي تدير عرض رأس جزء من الموقع.

المشكلة لدي هو أن ReturnURL التي قدمها LoginStatus السيطرة على إشارات الطريق إلى رأس السيطرة وليس صفحة المستخدم حاليا.هذا هو ربما يرجع ذلك إلى التسلسل الهرمي فئة و أن رأس التحكم (ascx) في الواقع يستخدم الملقم.تنفيذ على .aspx لتوليد 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>

عندما ينقر المستخدم على رابط تسجيل الدخول بشكل صحيح أنهم توجيهك إلى تسجيل الدخول.aspx, ومع ذلك ReturnURL المعروضة (غير صحيح - على الرغم من أنني يمكن أن نفهم لماذا) "ReturnUrl=%2fControls%2fPages%2fHeader.aspx".

مرة واحدة على صفحة تسجيل الدخول يمكنني بسعادة التعامل مع LoggedIn الحدث بشكل صحيح إعادة توجيه المستخدم إلى المكان الصحيح.ما أود القيام به هو إما:1) إزالة ReturnURL من سلسلة الاستعلام تماما 2) أن يكون قادرا على السيطرة على ReturnURL عندما LoginStatus التحكم في المقدمة.

لقد فعلت بعض عاكس-ing النظام.ويب.واجهة المستخدم.WebControls.LoginStatus ويبدو أن ذلك هو الثابت تلوينها دائما استخدام ReturnURL ، بناء على التعليمات البرمجية التالية:

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

هو دائما وضع reuseReturnURL إلى true.

ربما خياري الوحيد هو لفة بلدي LoginStatus السيطرة ؟

[تحرير:أصلا من أجل الإيجاز, أنا حذفت التفاصيل التالية]

هنا هو مثال بسيط حقا ما أنا أحاول أن تحقق:

مشروع تطبيق ويب الهيكل التالي:الموقع - ضوابط - مكونات - تذييل الصفحة.ascx - رأس.ascx - MasterPages - الموقع.ماجستير - الافتراضي.aspx - تسجيل الدخول.aspx

الصفحة هوامش أدناه إذا كنت مهتما.

لقد قمت بإنشاء عنصر تحكم مستخدم ويب الانفصال من الشواغل في صفحة تسجيل الدخول إلى استخدام asp:تسجيل الدخول الضوابط فإنها تحتاج إلى أن تكون متداخلة في (server-side) شكل.Asp:LoginStatus التحكم يحتاج أيضا إلى أن تكون متداخلة في (server-side) شكل.كما لا يمكن أن يكون أكثر من واحد من جانب الخادم النموذج على صفحة هذا يكسر.

أيضا, الجواب هو ليس فقط لقمع LoginStatus التحكم على صفحة تسجيل الدخول.تخيل لو أردت إضافة القليل من البحث السيطرة على الصفحة الرئيسية ، والتي من شأنها أن تعتمد أيضا على (server-side) شكل.وبالتالي سبب استخدام ملقم.وتنفيذ توليد صفحة من ASPX.هذه "الحيل" .صافي إلى السماح متعددة من جانب الخادم الأشكال على صفحة.(لا تسألني كيف...أنا لا أعرف!)

ربما بلدي كامل العمارة تصميم خاطئ ، ولكن كيف آخرون عدة عناصر تحكم مستخدم ويب على الصفحة التي تتطلب من جانب الخادم الأشكال ؟ أو أليس كذلك ؟

الموقع.سيد العلامات:

<%@ 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>

الافتراضي.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>

رأس.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>

تذييل الصفحة.ascx العلامات:

<%@ 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>

تسجيل الدخول.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"> والتفاف جميع المحتويات في هذا شعبة.
  2. تغيير رأس الخاص بك لا تتطلب ASP.NET شكل.ليس متأكدا مما إذا كان LoginView أو LoginStatus على حد سواء تتطلب ASP.NET شكل.ثم يمكنك ترك شكل علامة aspx الملفات التي تستخدم الصفحة الرئيسية (مثل لديك في الدخول.aspx).هذا هو ما تفضل هو فقط وضع شكل الكلمات في صفحات aspx (لا في الملفات الرئيسية) و تأكد من رؤوس تذييل الصفحة لا تحتاج إلى ASP.NET شكل (يمكن استخدام منتظم شكل الوسم ليس فقط مع runat=server).

نصائح أخرى

لماذا تفعل ملقم.تنفيذ الرأس.aspx من رأس الخاصة بك.ascx?لماذا لا تضع رأس.aspx رمز في الرأس.ascx.بهذه الطريقة ReturnUrl سوف تكون الصفحة كنت أتوقع أن يكون.

هناك شيء لا يبدو صحيحا تماما هنا:

على Page_Load ينفذ الخادم.Execute("~/ضوابط/Pages/رأس.aspx")
ويكتب المحتوى الحرفي

أنا لا أفهم لماذا يفعلون هذا ؟ تذكر أنه هو أنك تحاول الحصول على جميع أنحاء مشكلة ASP.NET لا يسمح لأكثر من واحد HtmlForm على الصفحة.ولكن إذا كنت مجرد وضع محتويات html من رأس.aspx في حرفية ثم كنت لا تستخدم HtmlForm??هل يمكنك وضع محتويات الرأس.aspx في شكل طبيعي الوسم (دون runat=server)?أو يمكن تسجيل الدخول في وضع التحكم في وضع خارج النموذج تماما ؟ هل محتويات الرأس.aspx حقا بحاجة إلى نموذج في المقام الأول ؟

وأود أن نلقي نظرة فاحصة على السبب في كتابة محتويات رأس الخاصة بك.صفحة aspx إلى حرفية ومحاولة حل المشكلة هناك بدلا من الغوص في LoginStatus التحكم وتغيير أن تفعل شيئا ليس المقصود منها أن تفعل.

واحدة أخرى من الممكن اقتراح:إذا كنت حقا بحاجة إلى القيام به لتحميل رأس في حرفية ، يمكنك استخدام صفحة.LoadUserControl بدلا من ذلك ؟ وهذا قد تحل تلقائيا عناوين url بالنسبة لك ؟ ليس متأكدا 100 ٪ على الرغم من.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top