【问题标题】:MvcSiteMapProvider Node URL rendered as /#MvcSiteMapProvider 节点 URL 呈现为 /#
【发布时间】:2017-02-21 12:35:15
【问题描述】:

如标题所述,面包屑导航中某个节点的 URL 不正确。我刚收到http://localhost/#

显然我有问题。 我在站点地图中有其他类似的结构正在工作。你能从中看出缺少了什么吗?

如果需要,我可以发布更多信息。

网站地图:

<mvcSiteMapNode title="ISP" controller="xxx" action="Index">
  <mvcSiteMapNode title="PC" action="Details" preservedRouteParameters="pcId">
    <mvcSiteMapNode title="SGD" controller="yyy" action="Details" preservedRouteParameters="pcId, yyyId, editable">
      <mvcSiteMapNode title="ESGN" controller="yyy" action="Title" preservedRouteParameters="pcId, yyyId, editable" />
    </mvcSiteMapNode>

动作:

    [HttpGet]
    [Route("xxx/{pcId:int}/yyy/{yyyId:int}/Details/{editable:bool}")]
    public virtual ActionResult Details(int pcId, int yyyId, bool editable)
    {


    [HttpGet]
    [Route("xxx/{pcId:int}/yyy/{yyyId:int}/Title")]
    public virtual ActionResult Title(int pcId, int yyyId)
    {

路线图:

    routes.MapRoute(
            name: "xxx",
            url: "xxx/{action}/{pcId}",
            defaults: new
            {
                controller = "xxx",
                action = "Index",
                pcId = UrlParameter.Optional
            }
            );

更新:删除“可编辑”参数时,它开始起作用。 超过 2 个参数会不会有问题?或者可能是参数的类型或名称?

根据 NightOwl88 的调试建议更新:

urlHelper 会生成正确的 url

这是我的控制器代码:

 [HttpGet]
    [Route("TransactionDetails/File/{fileId:int}")]
    public virtual ActionResult Index(int fileId)
    {
        {
            var urlHelper = new UrlHelper(new System.Web.Routing.RequestContext(this.HttpContext, this.RouteData));
            var url = urlHelper.Action("Index", "Transaction",
                new System.Web.Routing.RouteValueDictionary { { "id", 678 } });

            System.Diagnostics.Debug.WriteLine(url);
        }

        {
            var urlHelper = new UrlHelper(new System.Web.Routing.RequestContext(this.HttpContext, this.RouteData));
            var url = urlHelper.Action("Index", "File",
                new System.Web.Routing.RouteValueDictionary {{"fileId", 123}});

            System.Diagnostics.Debug.WriteLine(url);
        }

我得到: /AdministratorConsole/TransactionDetails/678 和 /AdministratorConsole/TransactionDetails/File/123

所以助手能够为我生成一个 url,但 MvcSiteMapProvider 仍然不高兴。

站点地图是:

    <mvcSiteMapNode title="Transaction Log" controller="TransactionLog" action="Index">
      <mvcSiteMapNode title="Transaction Details" controller="Transaction" action="Index" preservedRouteParameters="id">
        <mvcSiteMapNode title="File Details" controller="File" action="Index" preservedRouteParameters="id, fileId"> <!--TODO link back to parent not working-->

【问题讨论】:

    标签: mvcsitemapprovider


    【解决方案1】:

    # 表示无法根据提供的信息解析 URL(在当前请求和节点配置中的内容之间)。请参阅Why does Default UrlResolver throw an exception 了解说明。

    MvcSiteMapProvider通过MVC的UrlHelper类解析URL,所以如果遇到问题,应该use the UrlHelper explicitly来排查。如果您将以下代码放入控制器并对其进行编辑以匹配生成# 的请求,您将能够确定如何正确解析 URL。但是,与 MvcSiteMapProvider 不同,如果 URL 无法解析,UrlHelper 将返回 null。最可能的原因是您缺少路由设置为 required 的路由值。

    // Using controller and action
    var urlHelper = new UrlHelper(new System.Web.Routing.RequestContext(this.HttpContext, this.RouteData));
    var url = urlHelper.Action("View", "Videos", new System.Web.Routing.RouteValueDictionary { { "id", 123 } });
    
    // Using controller, action, and route name (similar to @Html.RouteLink())
    var urlHelper = new UrlHelper(new System.Web.Routing.RequestContext(this.HttpContext, this.RouteData));
    var url = urlHelper.RouteUrl("RouteName", new System.Web.Routing.RouteValueDictionary { { "controller", "Videos" }, { "action", "View" }, { "id", 123 } });
    

    【讨论】:

    • 谢谢我试一试。有趣的是,有问题的节点在列表中的最后一个节点时确实会获得一个好的 URL,但在倒数第二个节点时不会。
    • 我已经更新了我的问题。 UrlHelper 正在为我生成一个 URL,但 MvcSiteMapProvider 不是。还有什么我可以尝试的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多