通过带参数的键从MvcSiteMapProvider获取URL

时间:2015-10-06 14:30:44

标签: asp.net-mvc mvcsitemapprovider

我通常使用以下代码从节点获取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”。

1 个答案:

答案 0 :(得分:0)

使用preservedRouteParameters时,SiteMap不会自动生成应放置在节点上的路由值。它们来自页面的当前请求。通常,在执行此操作时,您需要使用ActionLinkActionRouteLinkUrlHelper来提供网址,这通常是执行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如何使用MVC UrlHelper