تشكيل عناصر في صفحات ASP.NET الرئيسية وصفحات المحتوى

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

سؤال

حسنًا ، عثرة طريق أخرى في مشروعي الحالي.

لم يكن لدي عناصر من قبل على حد سواء صفحات المحتوى الخاصة بي ، أميل إلى الحصول على جميع النماذج في المحتوى عند الصلة.

ومع ذلك ، في المشروع الحالي ، لدينا صفحة حيث يريدون كليهما. نموذج تسجيل الدخول في أعلى اليمين ، وتشكيل أسئلة في المحتوى.

بعد أن حاولت الحصول على هذا ، ركضت في مسألة ASP.NET يئن حول الحاجة إلى عنصر نموذج واحد في صفحة رئيسية. TBH ، أنا حقا لا أفهم لماذا هذا شرط من جانب ASP.NET ، ولكن يا هو.

هل يعرف أي شخص ما إذا كان يمكنني/كيف يمكنني الحصول على صفحات الماجستير والمحتوى لاحتواء عناصر النماذج التي تعمل بشكل مستقل؟

إذا لم يكن الأمر كذلك ، هل يمكنك تقديم نصيحة حول كيفية المتابعة للحصول على المظهر/الوظائف المطلوبة؟

هل كانت مفيدة؟

المحلول

اعتقدت أنني سأراجع بعض أسئلتي المتميزة ومعرفة ما إذا كان بإمكاني إغلاق بعضها.

كان هذا واحد مثير للاهتمام. لقد رفضت صريحًا أن أصدق أنه يمكنك الحصول على نموذج واحد فقط على صفحة ASP.NET. هذا بالنسبة لي لا معنى له. لقد رأيت الكثير من صفحات الويب التي تحتوي على أكثر من نموذج واحد على صفحة ويب ، لماذا يجب أن تكون صفحة ASP.NET مختلفة؟

اذا هذا يتطلب مني الفكير.

لماذا صفحة ASP.NET بحاجة إلى عنصر شكل؟

تحاول صفحات ASP.NET محاكاة بيئة WinForms ، من خلال استمرار الدولة من خلال نموذج Postback. هذا يوفر عنصرًا من الدولة لبيئة عديمة الجنسية. من أجل القيام بذلك ، يجب أن يكون وقت التشغيل قادرًا على الحصول على القدرة على الحفاظ على هذه الحالة في كل "نموذج". يفعل هذا عن طريق نشر البيانات إلى نفسها. من المهم أن نلاحظ أن:

  • لا يوجد شيء يتوهم حقًا عن Postback.
  • يستخدم نموذج HTTP ونشره ، مثل أي نموذج آخر ، من أي كومة أخرى.
  • لمجرد أنه يبدو أنه قد يفعل شيئًا مميزًا ، فلا يحدث كل ما يحدث هو Back's Back مع بعض المعلومات حول سبب ذلك ، حتى تتمكن من القيام بأشياء مثل التعامل مع الأحداث من جانب العميل ، في التعليمات البرمجية من جانب الخادم.

فلماذا واحد فقط؟

كان هذا بالنسبة لي سؤال مليون جنيه (أنا بريطاني). أفهم أن ASP.NET يحتاج إلى هذا ، خاصة إذا كنت تستخدم عناصر التحكم في خادم ASP.NET ، ولكن لماذا بحق الجحيم لا يمكنني صنع أشكال إضافية؟

لذلك ، اعتقدت المسمار ، فقط اصنع النموذج الخاص بك!

وفعلت. لقد أضفت نموذجًا بسيطًا وبسيطًا مع إجراء تقديم لـ "#". ثم يقوم هذا بتنفيذ منشور إلى الصفحة الحالية ، مع بيانات النموذج للنموذج المحدد في الطلب.

خمين ما؟ كل شيء يعمل بشكل جيد. لذلك انتهى بي الأمر مع:

  • صفحة رئيسية ، مع نموذج HTML في
  • ينشر هذا النموذج مرة أخرى إلى الصفحة الحالية (في الأساس الصفحة باستخدام Master).
  • في Page_Load Code-Behind for Master ، أضفت رمزًا للتحقق من الطلب لمعرفة البيانات التي تم تمريرها في الطلب. إذا كان يحتوي على بيانات (على سبيل المثال حقل مخفي) ، فأنا أعلم أن المنشور قد تم الحصول عليه من النموذج الموجود في الصفحة الرئيسية ، إن لم يكن كذلك ، فهو أكثر انتشارًا من المحتوى ، ويمكن تجاهله.
  • ثم أحاطت بعلامات المحتوى مع <form runat="server" id="aspNetForm"...> </form> العلامات. هذا يعني أن جميع صفحات المحتوى تلقائيًا لديها نموذج للعمل معه.

هذا ما زودني بحل بسيط ونظيف نسبيًا لمشكلتي. يعمل نموذج تسجيل الدخول الخاص بي بشكل جيد مع جميع نماذج المحتوى التي تم إنشاؤها ، وبعضها من النماذج المعقدة ، والبعض الآخر يستخدم الكثير من عناصر التحكم في الخادم والعديد من عمليات Postbacks ، وما إلى ذلك.

آمل أن يكون هذا يساعد الآخرين.

نصائح أخرى

علامة النموذج نفسها في Masterpage ، على هذا النحو ، يمكنك ترميز أي عناصر تحكم خادم ASP.NET على الصفحة الرئيسية التي ترغب في ذلك. ويمكنك كتابة منطق المعالجة لعناصر تحكم الخادم هذه على رمز الصفحة الرئيسية خلف الملف.

لذلك ، في المثال الخاص بك ، يمكنك الحصول على عناصر التحكم في تسجيل الدخول في الجزء العلوي اليمين من الصفحة الرئيسية ، ثم يكون لديك منطق المصادقة في صفحة التعليمات البرمجية للصفحة الرئيسية ، وليس صفحة المحتوى الخاصة بك.

يتيح لك ذلك الحصول على عناصر تحكم تسجيل الدخول في كل صفحة ، والحفاظ على تلك المعالجة ، وكذلك الحفاظ على عناصر التحكم في المحتوى ومعالجتها على صفحاتهم الفردية.

لقد ذكر الجميع بالفعل أنه لا يمكن أن يكون لديك سوى عنصر نموذج واحد في صفحة ASP.NET معينة ، وأنه سيكون موجودًا في الصفحة الرئيسية. حتى الان جيدة جدا. لكنني لا أعتقد أن هذا يساعدك على الحصول على مكان كامل حيث تريد أن تكون ...

في صفحاتك الرئيسية ، كنت (أفترض!) محددة asp:ContentPlaceHolder ضوابط. صفحاتك التي تستخدم السيد ثم لها المقابلة asp:Content العلامات. يجب أن يذهب كل محتوى صفحتك في هذه المقابلة asp:Content العلامات.

مرة واحدة في هذه العلامة ، فهي جزء من نموذج الصفحة الرئيسية. يمكن أن تستجيب الصفحة الرئيسية للأحداث من عناصر التحكم الخاصة بها ، والصفحات نفسها تستجيب للأحداث من عناصر التحكم الخاصة بها ، وأنت تم تعيينك.

إذا كنت بحاجة إلى الصفحة للتفاعل مع الصفحة الرئيسية ، فيمكنك الوصول إليها عبر Page.Master منشأه. للتفاعل مع أي رمز مرئي للجمهور (الأساليب ، الخصائص ، إلخ) من الصفحة الرئيسية ، يمكنك إلقاء هذه الخاصية على النوع الصحيح ، والوصول إلى الكود المرئي للجمهور من هناك.

يجب أن تحصل على المكان الذي يجب أن تكون فيه في هذا السيناريو. (لقد عملت بالنسبة لي في مواقع متعددة!)

روب ،

حل مثير للاهتمام. لا أرى أي مشكلة مع ما تفعله. ومع ذلك ، فإن المشكلة قد يواجهها البعض هي إذا حاولوا القيام بذلك باستخدام نموذجين خادمين. لا توجد قاعدة في ASP.NET لا يمكن أن يكون لديك أكثر من نموذج HTML 1 على صفحة ، فقط لا يمكنك الحصول على أكثر من نموذج "Runat = 'Server" على الصفحة. من الواضح أنك وجدت طريقة سهلة للغاية لتلبية احتياجاتك.

لقد وجدت أنه في معظم الأحيان ، لا يمثل التعامل مع نموذج واحد مشكلة لأن إطار عمل ASP.NET يفصل كل شيء بالنسبة لنا بحاويات تسمية. ولكن في تعليقك الأولي ، تضغطت على العامل المهم الذي كان غائبًا ولكنه حاسم لجوهر السؤال الأصلي: أدخل سلوك المفتاح. هذا دائما يرمي مفتاح القرد في الأعمال.

إذا كنت تريد استخدام نموذج خادم قياسي "All Complassing" ، ألا يمكنك التقاط الإجراء الصحيح باستخدام حدث تم تغيير نص مربع النص؟ بالطبع ، إذا قام المستخدم بتغيير كلتا القيمتين قبل الوصول إلى إدخال إما ، فستحصل على سلوك غريب. وأعتقد أن المشكلة الأساسية في مفتاح Enter هي أنه بمجرد أن تحصل على أكثر من إرسال إدخال على نموذج HTML ، فإن ضرب Enter في مربع نص لا يفعل أي شيء. فقط عندما يكون هناك عنصر إدخال واحد يقوم مفتاح Enter "بتكون" نقر ".

لم يعط أي من الإجابات السابقة مثال رمز. إليك نسخة مبسطة من موقع Visual Studio 2012. يوضح كيفية القيام بذلك:

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site - Copy.Master.cs" Inherits="WebApplication1.Site1Master" %>
<!DOCTYPE html>
<html>
    <head runat="server">
        <title>This is a title</title>
        <asp:ContentPlaceHolder runat="server" ID="HeadContent" />
    </head>
    <body>
    <form runat="server">
    <header>
        <div class="content-wrapper">
            <div class="float-right">
                <section id="login">
                    <asp:LoginView runat="server" ViewStateMode="Disabled">
                        <AnonymousTemplate>
                             <asp:ContentPlaceHolder runat="server" ID="AnonContent" />
                        </AnonymousTemplate>
                        <LoggedInTemplate>
                            <asp:ContentPlaceHolder runat="server" ID="LoggedInContent" />
                        </LoggedInTemplate>
                    </asp:LoginView>
                </section>
            </div>
        </div>
    </header>
        <div id="body">
        <asp:ContentPlaceHolder runat="server" ID="FeaturedContent" />
        <section class="content-wrapper main-content clear-fix">
            <asp:ContentPlaceHolder runat="server" ID="MainContent" />
        </section>
    </div>
    </form>
</body>
</html>

لذلك لديك كل شيء ملفوف بعنصر نموذج واحد ، بحيث يمكنك وضع عناصر تحكم في الصفحة الرئيسية ، ومع ذلك يمكن أن تستخدم صفحات المحتوى الخاصة بك عناصر التحكم.

يمكنك الحصول على نموذج واحد فقط على صفحة ASP.NET. طريقة واحدة للتعامل مع هذا هي وضع معالج الأحداث على زر تسجيل الدخول في الصفحة الرئيسية. سيقوم المعالج بالتحقق من صحة المستخدم وإعادة التوجيه إلى نفس الصفحة على النجاح (لتشغيل معالج Page_Load بشكل صحيح ، والذي يتم تشغيله قبل معالجات الأحداث).

لقد قمت بحل "النقر فوق مفتاح الإرجاع في شكل تسجيل الدخول الفرعي إلى تقديم المشكلة الرئيسية" في مشروعي الحالي عن طريق تضمين IFRAME في الصفحة الرئيسية. أشار Iframe إلى صفحة login.aspx التي قامت بمصادقة المستخدم.

<iframe id="login" src="login.aspx" frameborder="0" enableviewstate="false" scrolling="no" runat="server"></iframe>

(شكل بعض الأسباب التي احتجت إلى علامة الإغلاق /الإطارات وإلا فقد تم الخلط بين طريقة عرض التصميم)

يمكنك الوصول إلى أدوات التحكم في Masterpage من نموذج ASPX بواسطة: إضافة العلامة المشتقة إلى نموذج ASPX <٪@ MasterType VirtualPath = "~/site.master ٪>وفي الكود وراء الاستخدام Master.FindControl () ؛ للحصول على السيطرة بالمعرف

على سبيل المثال إذا كنت تريد الحصول على نموذج التحكم = Master.FindControl ("Form")

الآن يمكنك استخدام نموذج الصفحة الرئيسية في الكود الخاص بك.

آمل أن تكون هذه المساعدة.

مرهم! في موضوع مشابه ، نشرت إجابة قد تساعدك. يمكنك استخدام jQuery لإضافة محتوى إلى Div فارغ. يمكن أن يتضمن هذا المحتوى علامات النماذج ، وحتى وظيفة إرسال مستقلة عن أي شيء يقوم به رمز جانب الخادم. الجانب السلبي الوحيد لهذا هو إذا لم يتم تمكين المستخدم JavaScript!

بدلاً من إعادة نشر نفس الإجابة (والرمز أيضًا) ، إليك الرابط:

نموذج تحميل jQuery Ajax على ASP.NET WebForm

هذا هو قيود على ASP.NET

تم تصميم ASP.NET للحصول على نموذج واحد لكل صفحة ونموذج واحد فقط. عندما تم تصميمها في الأصل لم تكن مشكلة.

ولكن منذ ذلك الحين تم تحديد ذلك على أنه مشكلة كبيرة مع إمكانية الوصول.

Microsoft Fix لهذا كان ASP.NET MVC ، إذا كنت قادرًا على أن أقترح التفكير في الانتقال إلى ASP.NET MVC لأنه يحل عددًا كبيرًا من المشكلات مع ASP.NET

يمكنك الحصول على أكثر من نموذج واحد. (فقط واحد فقط مرآة في وقت واحد) Codeline 1 = النموذج 1 مرئي / نموذج 2 مخفي. الكود 2 النموذج 2 مرئي / نموذج 1 مخفي. = حل (هذا أمر رائع لنماذج الاتصال الثابتة أيضًا

لا ، يمكنك فقط الحصول على نموذج ASP.NET لكل صفحة. كانت تلك هي القاعدة منذ 1.0

يجب أن يشارك كلاهما نفس الشكل

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