我正在使用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
}
如果您需要我的更多信息,请告诉我。
答案 0 :(得分:1)
我这样做的方式,我用original mvc site map helper source来渲染面包屑,并将其更改为处理参数(尽管在我的项目中我们只显示过滤参数,并允许用户点击它们以松开其他过滤参数,下面是非常天真的节点文本实现,只是一个例子,它是如何完成的):
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方法,包括当前节点的请求参数。
答案 1 :(得分:0)
根据MVCSiteMapperProvider上的这个帖子,你不能使用Query字符串。它忽略查询字符串并仅使用路径数据。
Query Strings and MVCSiteMapper
您是否考虑过创建一些新路线而不是使用查询字符串?