保留时出现问题路由参数包含UrlParameter.Optional

时间:2016-07-07 03:13:02

标签: asp.net-mvc

这个问题困扰我几个小时。这是我的路线.MapRoute:

 routes.MapRoute(
            "SiteArea",
            "SiteArea/{area}/{link}",
            new { controller = "SiteArea", action = "Dispatch", link = UrlParameter.Optional },
            namespaces
        );

链接是可选的,可以为null。在Mvc.sitemap中:

<mvcSiteMapNode title="SiteArea" controller="SiteArea" action="Dispatch" route="SiteArea" preservedRouteParameters="area,link" />

在C#Mvc行动中:

public override ActionResult Dispatch(string area, string link)
    {
        var node = SiteMaps.Current.CurrentNode;
        if (node != null)
        {
            node.ParentNode.Title = area;
            node.Title = link;
        }

        return base.Dispatch(area, link);
    }

  

SiteMaps.Current.CurrentNode

总是抛出异常:

 The node with key _Home_Index_GET_Home__SiteArea_Dispatch_GET_SiteArea_' and title 'SiteArea' has 'area' configured in both RouteValues and PreservedRouteParameters, which is not allowed. PreservedRouteParameters copies the route value from the current HTTP request which would overwrite your configured RouteValue in every case. Either remove 'area' from PreservedRouteParameters or as a configured RouteValue.
    Alternatively, if you are configuring the node in XML and intend to use 'area' as a custom attribute, use the 'MvcSiteMapProvider_AttributesToIgnore' configuration setting to ensure 'area' is not automatically added to RouteValues. If using external DI, this setting is injected into the constructor of 'SiteMapXmlReservedAttributeNameProvider'.

我知道这个例外是假的,并不会告诉任何有用的问题。 但是,我有完全相同的位置,除了链接不是UrlParameter.Optional - 不可空,它工作正常。 任何人都可以解释或提供这个问题的解决方案 - 当第二个保留的参数是可选的吗?

3 个答案:

答案 0 :(得分:0)

我只是想出了问题的根本原因。我在使用区域关键字:

routes.MapRoute(
                "SiteArea",
                "SiteArea/{area}/{link}",
                new { controller = "SiteArea", action = "Dispatch", link = UrlParameter.Optional },
                namespaces
            );

并在Mvc.sitemap中:

<mvcSiteMapNode title="SiteArea" controller="SiteArea" action="Dispatch"  preservedRouteParameters="area" >
        <mvcSiteMapNode title="SiteArea" controller="SiteArea" action="Dispatch"  preservedRouteParameters="area,link"  />
      </mvcSiteMapNode>

更改

  
    区域到     站点区域

  
一切都像魅力一样。

答案 1 :(得分:0)

如果您的项目使用MVC区域,

areaMvcSiteMapProvider中的保留路由值。如果您没有使用MVC区域,则仍有一个自动路由值用作默认区域(area = "")。

因此,您需要将路由密钥更改为area以外的其他名称。否则,由于此冲突,此值无法放入preservedRouteParameters

routes.MapRoute(
        "SiteArea",
        "SiteArea/{myArea}/{link}",
        new { controller = "SiteArea", action = "Dispatch", link = UrlParameter.Optional },
        namespaces
    );

<mvcSiteMapNode title="SiteArea" controller="SiteArea" action="Dispatch" route="SiteArea" preservedRouteParameters="myArea,link" />

答案 2 :(得分:0)

我遇到了这样的错误,并对其发生原因感到困惑。在进行过多故障排除之前,请尝试再次运行代码。对我来说,这似乎是神秘的,但并没有发生在第二,第三等尝试中。