9

我正在使用来自http://mvcsitemap.codeplex.com/的 MvcSiteMapProvider为我的项目创建面包屑路径。我有一些 URL 需要传递一个 ID 来为适当的用户提供信息,例如 http://localhost:52306/Home/User?ID=101101

当我进一步导航到站点地图(例如 http://localhost:52306/Home/User/Details?ID=101101)并尝试使用面包屑链接将我带回“用户”页面时,ID 参数丢失. 我尝试将 SiteMapPreserveRouteData 属性添加到操作方法中,但它们似乎没有做任何事情。是否有一种简单的方法可以确保保留此 ID 信息?我认为 SiteMapPreserveRouteDataAttribute 应该这样做,那么我在属性上做错了什么吗?我的方法如下所示:

[SiteMapPreserveRouteData]
public ActionResult User()
{
  //code
}

如果您需要我提供更多信息,请告诉我。

4

2 回答 2

1

我这样做的方式是,我使用原始的 mvc 站点地图助手源来渲染面包屑,并将其更改为处理参数(尽管在我的项目中,我们仅显示用于过滤的参数并允许用户单击它们以释放其他过滤参数,下面是节点文本的非常幼稚的实现,只是一个如何完成的示例):

   private static string SiteMapText(this MvcSiteMapHtmlHelper helper, SiteMapNode node, string linkCssClass, IDictionary<string, object> htmlAttributes)
    {
        var extraAttributes = new StringBuilder();
        foreach (var attribute in htmlAttributes)
        {
            extraAttributes.Append(" " + attribute.Key + "=\"" + attribute.Value + "\"");
        }            

        string spanHtml;
        var paramDictionary = helper.HtmlHelper.ViewContext.RequestContext.HttpContext.Request.Params.ToDictionary();
        var queryParams = paramDictionary.Select(x => string.Format("{0}:{1}", x.Key, x.Value));

        // here you add request parameters
        var title = helper.HtmlHelper.Encode(string.Format("{0} ({1})", node.Title, string.Join(";", queryParams)));

        if (!string.IsNullOrEmpty(linkCssClass))
        {
            spanHtml = string.Format("<span><span class=\"{0}\"{1}>{2}</span>", linkCssClass, extraAttributes, title);
        }
        else
        {
            spanHtml = string.Format("<span><span{1}>{0}</span>", title, extraAttributes);
        }

        return spanHtml;
    }

以同样的方式,您可以调整 SiteMapLink 方法,以包含当前节点的请求参数。

于 2012-01-17T07:23:56.650 回答
0

根据 MVCSiteMapperProvider 上的这个线程,您不能使用查询字符串。它忽略查询字符串,只使用路由数据。

查询字符串和 MVSiteMapper

您是否考虑过创建一些新路由而不是使用查询字符串?

于 2011-12-29T14:03:19.733 回答