Tôi đã gặp phải vấn đề này và thẳng thắn, không tìm ra giải pháp nào làm tôi hạnh phúc ... vì vậy tôi mượn ý tưởng từ đây và ở đó. Giải pháp của tôi là đa phần: a) có SiteMapProvider tìm trang thực sự xử lý yêu cầu và sử dụng nút của nó và b) sử dụng các kỹ thuật tiêu chuẩn để cập nhật sitemapnode từ đó.
A) Sự cố mà tôi tiếp tục gặp phải là nếu tôi không có đường dẫn ảo chính xác, SiteMap.CurrentNode sẽ là rỗng và kích hoạt hàm SiteMapResolve. Để giải quyết việc này tôi subclassed XmlSiteMapProvider và overrode CurrentNode:
namespace WebFormTools
{
class RouteBaseSitemapProvider : XmlSiteMapProvider
{
public override SiteMapNode CurrentNode
{
get
{
var node = base.CurrentNode;
if (node == null)
{
// we don't have a node, see if this is from a route
var page = HttpContext.Current.CurrentHandler as System.Web.UI.Page;
if (page != null && page.RouteData != null)
{
// try and get the Virtual path associated with this route
var handler = page.RouteData.RouteHandler as PageRouteHandler;
if (handler != null) {
// try and find that path instead.
node = FindSiteMapNode(handler.VirtualPath);
}
}
}
return node;
}
}
}
}
Về cơ bản nếu việc thực hiện mặc định không tìm thấy bất cứ điều gì, nhìn lên con đường (nếu có) và cố gắng tìm các nút sử dụng đường dẫn ảo của handler.
Để tham khảo ở đây là một phần của Web.Config của tôi, Global.asax và SiteMap file:
Thêm nhà cung cấp
<siteMap defaultProvider="RouteBaseSitemapProvider">
<providers>
<add name="RouteBaseSitemapProvider" type="WebFormTools.RouteBaseSitemapProvider" siteMapFile="Web.sitemap" />
</providers>
</siteMap>
Tuyến:
routes.MapPageRoute("EvalRoutes",
"Evals/{type}/New.aspx",
"~/Evals/New.aspx");
Và SiteMap:
<siteMapNode url="~/Evals/New.aspx" title="New Eval - {type}" description="" />
B) Tôi phân lớp System.Web.UI.Page, hòn đảo có tên BaseClass, có thêm một phương pháp để đăng ký xử lý cho sự kiện SiteMapResolve:
public System.Web.SiteMapNode Process(System.Web.SiteMapNode currentNode)
{
if (currentNode == null) return currentNode;
var page = HttpContext.Current.CurrentHandler as System.Web.UI.Page;
if (page != null && page.RouteData != null)
{
Dictionary<Regex, string> replacements = new Dictionary<Regex, string>();
// build a list of RegEx to aid in converstion, using RegEx so I can ignore class. Technically I could also
foreach (var key in page.RouteData.Values.Keys)
{
replacements.Add(new Regex(string.Format("\\{{{0}\\}}", key), RegexOptions.IgnoreCase), page.RouteData.Values[key].ToString());
}
// navigate up the nodes
var activeNode = currentNode;
while (activeNode != null)
{
// to the replacements
foreach(var replacement in replacements)
{
activeNode.Title = replacement.Key.Replace(activeNode.Title, replacement.Value);
}
activeNode = activeNode.ParentNode;
}
}
return currentNode;
}
tôi vẫn cần phải có bản đồ các URL một cách thích hợp (sẽ sử dụng URL của trang nhận được tuyến đường), đây là thông tin định tuyến không đúng. Tôi có thể sẽ sử dụng thuộc tính tùy chỉnh trong sơ đồ trang web để cho nút biết cách hiển thị URL.
Tuyệt! Cảm ơn. Tôi sẽ đăng một giải pháp mà tôi đã đưa ra quá. – Armstrongest
Tôi làm cách nào để sử dụng lớp này trong trang aspx của mình? xin vui lòng giúp đỡ –