سؤال

لديّ عنصر تحكم مستخدم يحتوي على GridView. يحتوي GridView على عمود حقل الارتباط التشعبي وعمود قالب يحتوي على عنصر تحكم في الارتباط التشعبي.

تم تنظيم مشروع ASP.NET على النحو التالي ، مع صفحة Default.aspx في كل حالة باستخدام عنصر تحكم المستخدم.

  • جذر التطبيق
    • ضوابط
      • UserControl مع Gridview
    • SystemAdminfolder
      • default.aspx
      • edit.aspx
    • OrganisationAdminfolder
      • default.aspx
      • edit.aspx
    • StandardUserfolder
      • default.aspx
      • edit.aspx

ملاحظة: يتم استخدام المجلدات لضمان أن يكون للمستخدم الدور الصحيح.

يجب أن أكون قادرًا على تعيين datanavitiveTurlFormatString لـ Hyperlinkfield و tavigateurl حتى يتم حل الارتباط التشعبي إلى صفحة edit.aspx في المجلد المقابل.

إذا قمت بتعيين عنوان URL للتنقل على "edit.aspx" عنوان URL في المتصفح يظهر باسم "http: // application الجذر/عناصر التحكم/edit.aspx بغض النظر عن الدليل الأصلي.

لا يمكنني استخدام مشغل جذر تطبيق الويب (~/) حيث يجب أن يكون المسار بالنسبة للصفحة الحالية ، وليس جذر التطبيق.

كيف يمكنني استخدام عنصر تحكم المستخدم نفسه في مجلدات متعددة وحل عنوان URL إلى صفحة أخرى في نفس المجلد؟

ملاحظة: يعتمد السؤال بشدة على سؤال مماثل Azhar2000s على منتديات ASP.NET هذا يطابق مشكلتي.

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

المحلول

أثناء كتابة هذا السؤال ، صادفت حلًا ممكنًا وقمت بتعديل هذا باستخدام التعليقات من Thomas.

التغيير control.apprelativetemplatesourcedirectory يغير المسارات النسبية الناتجة عن السيطرة. لقد قمت بتعيينه على المسار الافتراضي النسبي الجذر لمجلد الطلبات الحالية. الآن أي مسارات نسبية في USERCONTROL مع أن تكون نسبة إلى الصفحة المطلوبة بدلاً من مسار التحكم في المستخدم.

//Page Load Event for the User Control
protected void Page_Load(object sender, EventArgs e)
{
    string rootPath = HttpContext.Current.Request.ApplicationPath;
    if (!rootPath.EndsWith("/"))
    {
        rootPath += "/";
    }

    Uri requestUri = HttpContext.Current.Request.Url;
    string folderPath = requestUri.AbsolutePath.Remove(0, rootPath.Length);
    string lastSegment = requestUri.Segments[requestUri.Segments.Length - 1];
    folderPath = folderPath.Remove(folderPath.LastIndexOf(lastSegment));

    AppRelativeTemplateSourceDirectory = "~/" + folderPath;
}

نصائح أخرى

أود تعيينه في حدث تحميل الشبكة أو الصفحة مثل:

var hyperlinkColumn = this.GridView1.Columns[0] as HyperLinkColumn;
hyperlinkColumn.DataNavigateUrlFormatString = "~/SystemAdminFolder/{0}";

يفترض هذا الهيكل أن عنوان URL يجب أن يكون مختلفًا لكل صف بناءً على DataNavigateUrlField. إذا كان يجب أن يكون هو نفسه عنوان URL لجميع الصفوف ، فيمكنك فقط تعيين ملف NavigateUrl خاصية في التحميل. من الواضح أنك ستضع مجلد مختلف بناءً على دور المستخدم.

إضافة بالنظر إلى ما ذكرته في مشكلتك في التعليقات ، فإن ما أقترحه هو تخزين علاقة مجلد الأدوار في مكان ما. لديك عدد من الخيارات:

  1. ما عليك سوى تخزين مفاتيح تسميتها بطريقة سحرية في Appsettings (robs_systemadministrators ، roly_organizationadministrators ، وما إلى ذلك) مع اسم المجلد الذي يجب توجيههم إليه. ميزة هذا النهج هي أنه بسيط. العيب هو أنه يجب إدخال البيانات بشكل صحيح ، لا يوجد شيء يمنع شخص ما من رسم خرائط عن طريق الخطأ إلى مجلدين وعندما تتم إضافة دور ، يجب تحديثه في مكان آخر.

  2. إنشاء تكوينات مخصصة لتخزين العلاقة. الميزة هي أنه يمكنك التأكد من أن كل دور مدرج مرة واحدة فقط. العيب هو أنه رمز إضافي يجب أن تكتبه ، وعندما تتم إضافة دور ، لا يزال يتعين عليك إضافة شيء ما في مكان آخر.

  3. إقرأ ال location العلامات خارج ملف التكوين. الميزة هي أنه يمكنك تجنب الاضطرار إلى كتابة قيمة في أكثر من مكان واحد. العيب هو أن القيام بذلك سيكون واجبًا. يجب عليك العثور على العلامة الأولى المرتبطة بالمجلد المحدد الذي تم منح المستخدم الحالي إذنًا.

  4. اقرأ القيم خارج قاعدة البيانات. الميزة هي أنه يمكنك بسهولة كتابة شاشة إدارة لتحديث القيم. العيب هو عند إضافة دور ، تحتاج إلى إضافة شيء إلى موقع مختلف تمامًا للتطبيق.

لا يزال بإمكانك تعيين أذونات المجلد كما تفعل الآن. ومع ذلك ، بمجرد تخزين هذه العلاقة ، يمكنك إعادة توجيه الشخص إلى المجلد المناسب دون أن تكتب رمزًا مخصصًا.

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