توجيه Sitemap و URL
-
24-09-2019 - |
سؤال
لدي سؤال مشابه للسرة الموصوفة هنا:
توجيه 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 في الأعلى يجب أن يحتوي المنزل والتقارير والعروض التقديمية وقائمة على اليسار مع محوقيها الفرعية (على سبيل المثال مع اختيار المنزل يجب أن تكون: الصفحة الرئيسية ، الأسئلة الشائعة).
أسئلتي:
ما هي الطريقة الصحيحة للتعامل مع عناوين URL SitemapNode المكررة؟
كيف يمكنني منع tabstrip من توليد عناوين URL مثل:: // home/home و: // host/extrareports؟
أحتاج إلى الحفاظ على اختيار الشركة الحالية و ProjectNo ، وتجاهل Sitemap عناوين URL النسبيةتحتاج عناصر التحكم في 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/العروض التقديمية