【问题标题】:Specify parameter for parent node in MvcSiteMapProvider在 MvcSiteMapProvider 中为父节点指定参数
【发布时间】:2016-05-26 23:46:01
【问题描述】:

我有一个这样的站点地图:

<mvcSiteMapNode title="Home" controller="Home" action="Index">
    <mvcSiteMapNode title="Contact" controller="Home" action="Contact"/>
    <mvcSiteMapNode title="Project" controller="project" action="Index">
        <mvcSiteMapNode title="Edit a Project" 
            controller="project" action="edit" preservedRouteParameters="id"/>
    </mvcSiteMapNode>
</mvcSiteMapNode>

如果我在编辑页面上的 url 如下:

localhost/project/edit/12de8b10-aaae-ebbb-cccc-00215e466552

我希望 Project 的面包屑链接是这样的:

localhost/project/?projectid=12de8b10-aaae-ebbb-cccc-00215e466552

这可能吗?我不知道该用什么术语来描述它。

【问题讨论】:

    标签: asp.net-mvc mvcsitemapprovider


    【解决方案1】:

    MvcSiteMapProvider 将 URL 生成委托给 MVC UrlHelper 类。此类反过来使用您的路由来确定如何生成 URL。因此,您想要对 URL 进行的任何更改都应该使用路由来完成。对于这种特殊情况,您需要添加自定义路由。

    注意:路由不处理查询字符串参数。但是,当生成将未定义的路由值放入的 URL 时,它会将它们的值附加到查询字符串中。请注意,从技术上讲,这不算作“路由”——这些参数永远不会放在传入请求的路由值集合中,因此默认情况下MvcSiteMapProvider 将忽略它们。与查询字符串值不同,默认情况下不会忽略路由值,因此您必须始终将它们考虑在内。

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
            routes.MapRoute(
                name: "Project",
                url: "project",
                defaults: new { controller = "Project", action = "Edit" }
                );
    
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
    

    那么你的站点地图配置应该是

    <mvcSiteMapNode title="Home" controller="Home" action="Index">
        <mvcSiteMapNode title="Contact" controller="Home" action="Contact"/>
        <mvcSiteMapNode title="Project" controller="Project" action="Index">
            <mvcSiteMapNode title="Edit a Project" 
                controller="Project" action="Edit" />
        </mvcSiteMapNode>
    </mvcSiteMapNode>
    

    然后您需要提供projectid 才能通过您自己的ActionLink 访问该页面。

    @Html.ActionLink("Edit Project", "Edit", "Project", new { projectid = "12de8b10-aaae-ebbb-cccc-00215e466552" }, null)
    

    这将转到 URL localhost/project/?projectid=12de8b10-aaae-ebbb-cccc-00215e466552

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      • 1970-01-01
      相关资源
      最近更新 更多