我想到匹配的"近似"匹配网络。网站地图

网络。网站地图静态网站提供运作良好,除了一件事。它是静态的!

所以,如果我将要有一个sitemapnode为每10 000名文章,在我的网页,像这样:

  • site.com/articles/1/article-title
  • site.com/articles/2/another-article-title
  • site.com/articles/3/another-article-again
  • ...
  • site.com/articles/9999/the-last-article

是有某种配符映我可以做用的网站地图,以配合下任何东西的文章?

或者也许在我web表单页上,有一个方法手动设置的前节点?

我已经找到了一个"比特"的帮助 这页 在这样做时用的ASP.Net 视的框架,但仍在寻找一个很好的解决方案web表单.

我认为我必须要做的是创造一个定制网站供应商

有帮助吗?

解决方案

这是响应的评论上。我不能发布全代码,但是这基本上是我的供应商工作。

假设你有一个网页的文章。aspx,它使用的查询串参数"id"检索和显示一篇文章,题目和主体。然后这就是在网。网站:

<siteMapNode url="/article.aspx" title="(this will be replaced)" param="id" />

然后,你创建这类:

public class DynamicSiteMapPath : SiteMapPath
{
  protected override void InitializeItem(SiteMapNodeItem item)
  {
    if (item.ItemType != SiteMapNodeItemType.PathSeparator)
    {
      string url = item.SiteMapNode.Url;
      string param = item.SiteMapNode["param"];

      // get parameter value
      int id = System.Web.HttpContext.Current.Request.QueryString[param];

      // retrieve article from database using id
      <write your own code>

      // override node link
      HyperLink link = new HyperLink();
      link.NavigateUrl = url + "?" + param + "=" + id.ToString();
      link.Text = <the article title from the database>;
      link.ToolTip = <the article title from the database>;
      item.Controls.Add(link);
    }
    else
    {
      // if current node is a separator, initialize as usual
      base.InitializeItem(item);
    }
  }
}

最后,使用该供应商在你的代码,就像你可以使用静态的供应商。

<mycontrols:DynamicSiteMapPath ID="dsmpMain" runat="server" />

我的课上是复杂得多,但是这些都是基本知识。而不是使用一个查询参数,可以就分析的友好的网址是使用,并使用,而不是检索的正确的内容。尽量减少额外的db查找每一请求,可以添加一个缓存机制的提供者(文章标题通常不会改变往往).

希望这会有所帮助。

其他提示

这不完全是一个回答你的问题我认为,也许它给你一个想法。我曾经写了一个DynamicSiteMapPath类继承SiteMapPath.我用一个定义属性在每 <siteMapNode> 标签网络。网站地图,像这样:

<siteMapNode url="dynamicpage.aspx" title="blah" params="id" />

然后DynamicSiteMapPath类得到的"id"参数值,检索内容的数据库,并复盖目前呈现的网站地图项目的节点的正确标题和链接。这要花一个小的工作,但当正确地做这是一个非常简洁的方式提供动态页的支持。

我已经跑到这个问题,坦率地说,没有找到任何解决方案,使我快乐...所以借我的想法从这里和那里。我的解决方案的多部分:a)有SiteMapProvider找到实际的网页处理的请求,并使用它的节点和b)使用标准的技术用于更新sitemapnode从那里。

一个)的问题我一直运行到的是,如果我没有正确的虚拟的路径、网站地图。CurrentNode将空和火SiteMapResolve功能。为解决这个我的子类XmlSiteMapProvider和复盖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;
            }
        }
    }
}

基本上,如果缺省实施并没有找到任何东西,看起来的途径(如果有的话),并试图找到节点采用的处理程序是虚拟的路径。

供参考这里是我的一部分网络。Config,全球性的。asax网站地图和文件:

增加的提供者

    <siteMap defaultProvider="RouteBaseSitemapProvider">
  <providers>
    <add name="RouteBaseSitemapProvider" type="WebFormTools.RouteBaseSitemapProvider" siteMapFile="Web.sitemap" />
  </providers>
</siteMap>

路线:

            routes.MapPageRoute("EvalRoutes",
            "Evals/{type}/New.aspx",
            "~/Evals/New.aspx");

和网站:

        <siteMapNode url="~/Evals/New.aspx" title="New Eval - {type}"  description="" />

B)我的子类系统。网。用户界面。页面,取名为BaseClass,其中增加了一个方法注册处理程序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;
    }

我还是需要有地图网址适当地(中将使用该网页的网址接受的路线),这是无路由信息。我可能会使用一个定义属性的地图告诉这点如何使该网址。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top