سؤال

لدي سؤال مشابه للسرة الموصوفة هنا:
توجيه URL ASP.NET مع WebForms - باستخدام خريطة Sitemap

يحتوي WebApplication الخاص بـ ASP.NET على خريطة sitemplication ، على غرار هذا:

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode title="Root">
    <siteMapNode url="Home" title="Home" />
      <siteMapNode url="Home?" title="Home" />
      <siteMapNode url="Faq" title="FAQ" />
    </siteMapNode>
    <siteMapNode url="Reports" title="Your reports" />
      <siteMapNode url="Reports?" title="Your reports" />
      <siteMapNode url="ExtraReports" title="Extra reports" />
    </siteMapNode>
    <siteMapNode url="Presentations" title="Your presentations" />
      <siteMapNode url="Presentations?" title="Your presentations" />
      <siteMapNode url="ExtraPresentations" title="Extra presentations" />
    </siteMapNode>
 </siteMapNode>

أرغب في الحصول على عنوان URL بالتنسيق التالي:
: // المضيف/المشاريع/{Company}/{projectNo}/home
: // المضيف/المشاريع/Microsoft/10/Home
: // المضيف/المشاريع/Microsoft/11/تقارير
: // المضيف/المشاريع/Apple/10/extrareports

مسارات توجيه URL/مشاريع/{Company}/{projectNo}/{pagename} to /pages/ {pagename ).aspx.

يتكون التنقل الخاص بي من tabstrip في الأعلى يجب أن يحتوي المنزل والتقارير والعروض التقديمية وقائمة على اليسار مع محوقيها الفرعية (على سبيل المثال مع اختيار المنزل يجب أن تكون: الصفحة الرئيسية ، الأسئلة الشائعة).

أسئلتي:

  1. ما هي الطريقة الصحيحة للتعامل مع عناوين URL SitemapNode المكررة؟

  2. كيف يمكنني منع tabstrip من توليد عناوين URL مثل:: // home/home و: // host/extrareports؟
    أحتاج إلى الحفاظ على اختيار الشركة الحالية و ProjectNo ، وتجاهل Sitemap عناوين URL النسبية

  3. تحتاج عناصر التحكم في TabStrip و Menu إلى التعرف على العناصر المحددة لإظهار التحديد النشط. ما هو الحل المناسب لكل هذا؟

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

المحلول

بعد قضاء بضع ساعات على هذا ، أعتقد أنني وصلت إلى حل جيد (بما فيه الكفاية :)).

ملف sitemap
لاحظ أن العقد بدون عنوان URL ستشير إلى الوالد

<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
    <siteMapNode>
        <siteMapNode title="Home" url="Home">
            <siteMapNode title="Home" />
            <siteMapNode title="xxx" url="Cycle"/>
            <siteMapNode title="yyy" url="Survey" />
            <siteMapNode title="zzzteam" url="Team" />
        </siteMapNode>
        ...

فئة فائدة لإنشاء عنوان URL
CurrentContext هو مرجع ثابت إلى requestContext

public static string GetPageUrl(SiteMapNode node) {
   RouteValueDictionary values = new RouteValueDictionary(CurrentContext.RouteData.DataTokens);
   values["page"] = node.Url.Trim('/');

   return CurrentContext.RouteData.Route.GetVirtualPath(CurrentContext, values).VirtualPath;
}

أحداث قاعدة البيانات في Masterpage
التنقل عبارة

private void navigation_TabDataBound(object sender, Telerik.Web.UI.RadTabStripEventArgs e) {
   if (!String.IsNullOrEmpty(e.Tab.NavigateUrl)) {              
          SiteMapNode node = (SiteMapNode) e.Tab.DataItem;

   // Is this tab a parent of the current navigation node? Then select it
   if (SiteMap.CurrentNode.IsDescendantOf(node)) e.Tab.Selected = true;
          e.Tab.NavigateUrl = XRouteHandler.GetPageUrl(node);
   }
}

private void subNavigation_MenuItemDataBound(object sender, MenuEventArgs e) {
    SiteMapNode itemNode = (SiteMapNode) e.Item.DataItem;
    SiteMapNode currentNode = SiteMap.CurrentNode;

    // SiteMapNodes without url will point to the parent node
    if (String.IsNullOrEmpty(itemNode.Url)) {
        itemNode = itemNode.ParentNode;
        e.Item.Selectable = true;
    }

    // Is this menu item the node itself or one of it's parents? Then select it
    if (currentNode == itemNode || currentNode.IsDescendantOf(itemNode))
        e.Item.Selected = true;
        e.Item.NavigateUrl = XRouteHandler.GetPageUrl(itemNode);
    }
}

XMLSITEMAPPROVIDER تنفيذ
هذا الحل جيد بما فيه الكفاية الآن ، سوف ينظر إليه لاحقًا لتكوينه :)

public override SiteMapNode FindSiteMapNode(HttpContext context) {
        string pageName = context.Request.Url.Segments.Last().Trim('/');
        foreach (SiteMapNode node in SiteMap.RootNode.GetAllNodes())
                if (node.Url.EndsWith(pageName, StringComparison.InvariantCultureIgnoreCase)) return node;
        return SiteMap.RootNode;
}

نصائح أخرى

Zyphax ،

من المرجح أن تضطر إلى إعادة كتابة عناصر التحكم في TabStrip و Menu To That To That To That To That To That To That To Controw Think. هذا يعني أيضًا أنه يمكنك إزالة sitemapnodes المكررة.

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

public SiteMapNode FurthestAncestor(this SiteMapNode node)
{
    while (node.Key !=  this.RootNode.Key && node.ParentNode.Key != this.RootNode.Key)
    {
        node = node.ParentNode;
    }

    return node;
}

أيضا استخدام عناوين URL النسبية سوف يساعد ../presentations عوضا عن /مشاريع/Apple/10/العروض التقديمية

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