我通常使用以下代码从节点获取url:
MvcSiteMapProvider.SiteMaps.Current.FindSiteMapNodeFromKey("AccountDetailsKey").Url
现在我有一个带参数的节点。但是如何获取该节点的url。因此,在下面的示例中,我们需要“AccountDetailsKey”节点的URL。
<mvcSiteMapNode key="BeherenAccountKey" title="Zoeken accounts" controller="BeherenAccount" action="BeherenAccount">
<mvcSiteMapNode key="AccountDetailsKey" title="Account details" controller="BeherenAccount" action="AccountDetails" preservedRouteParameters="gebruikersnaam" visibility="!SiteMapHelper,!MainMenu,*" />
</mvcSiteMapNode>
详情行动:
[Route("account/details/{gebruikersnaam}")]
public ActionResult AccountDetails(string gebruikersnaam)
{
return this.View((object)gebruikersnaam);
}
De routeconfig:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });
}
Offcourse我们可以使用以下内容生成一个带有常规MVC剃刀代码的详细信息页面的URL:
@Url.Action("AccountDetails", "BeherenAccount", new { gebruikersnaam = User.Identity.Name.ToLower().Replace("domain\\", "") })
问题是我们不想在代码中使用操作和控制器名称。我们想要从站点地图生成所有网址。在整个应用程序中一切正常,但无法使此详细信息页面正常工作。我们没有DynamicNodeProvider,因为我们不关心单独的标题,seo等因为它是管理员应用程序。
应用程序在主菜单(_Layout页面)中显示登录用户,这是他自己的详细信息页面的URL。
因此,当登录用户的用户名为“abc”时,详细信息网址必须为“account / details / abc”。
答案 0 :(得分:0)
使用preservedRouteParameters
时,SiteMap
不会自动生成应放置在节点上的路由值。它们来自页面的当前请求。通常,在执行此操作时,您需要使用ActionLink
,Action
,RouteLink
或UrlHelper
来提供网址,这通常是执行CRUD操作时的情况,因为链接需要从数据库数据中派生出来。
@Html.ActionLink("Gebruikersnaam", "AccountDetails", "BeherenAccount", new { gebruikersnaam = "Value" }, null)
或者,如果当前请求中不存在名为gebruikersnaam
的路由值,则可以手动提供。
string url;
var node = MvcSiteMapProvider.SiteMaps.Current.FindSiteMapNodeFromKey("AccountDetailsKey");
if (node != null)
{
node.RouteValues["gebruikersnaam"] = "Value";
url = node.Url;
}
当您在ISiteMapNodeProvider
或动态节点提供程序之外设置路由值时,设置的值将仅持续当前请求的生命周期。
注意:我真的不明白您使用上述代码时遇到的确切问题。在我的测试项目中,无论你在哪个页面,它都能正常工作。如果您想进一步调查,可以使用Controlling URL Behavior中的代码来模仿
SiteMapNodeUrlResolver
如何使用MVCUrlHelper
。