MVC路由和SiteMap未导致正确的痕迹路径

时间:2015-11-03 14:58:27

标签: c# asp.net-mvc url-routing asp.net-mvc-routing mvcsitemapprovider

我使用MVC.SiteMap,取得了一些成功。当我有一个3步路径(或更多)时,唯一的问题就出现了。让我分享一些代码来澄清我的问题:

经过一些清理,这是我的路线表:

        routes.MapRouteWithName(
            name: "RealizacaoPesquisa",
            url: "RealizacaoPesquisa/{action}/{idPesquisa}/{nrProntuario}/{id}",
            defaults: new { controller = "RealizacaoPesquisa", action = "Index", idPesquisa = UrlParameter.Optional, nrProntuario = UrlParameter.Optional, id = UrlParameter.Optional }
        );

        routes.MapRouteWithName(
            name: "Geral",
            url: "{controller}/{action}/{id}/{str}",
            defaults: new { controller = "Home", action = "Index" }
        );

        routes.MapRouteWithName(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

这是我的SiteMap XML:

<mvcSiteMapNode title="Realização de Pesquisas" controller="RealizacaoPesquisa" action="Index">
  <mvcSiteMapNode title="Participação de Pesquisa" controller="RealizacaoPesquisa" action="Participacao" preservedRouteParameters="idPesquisa">
    <mvcSiteMapNode title="Paciente em Pesquisa" controller="RealizacaoPesquisa" action="ParticipacaoPaciente" preservedRouteParameters="idPesquisa;nrProntuario"/>
  </mvcSiteMapNode>
</mvcSiteMapNode>

我的期望:

1)访问第一页时(action =&#34; Index&#34;),它会显示Realização de Pesquisas

2)访问第二页时(action =&#34; Participacao&#34;,idPesquisa = 2),它会显示Realização de Pesquisas > Participação de Pesquisas

3)访问第三页时(action =&#34; ParticipacaoPaciente&#34;,idPesquisa = 2,nrProntuario =&#34; 032&#34;),它会显示Realização de Pesquisas > Participação de Pesquisas > Paciente em Pesquisa

现在,除了第3项之外它是有效的(在第3项它只是赢得了任何东西,让我相信它不匹配siteMap的任何XML节点)。

编辑:

另一种产生相同结果的尝试是使用以下路线:

        routes.MapRouteWithName(
            name: "RealizacaoPesquisa_Participacao",
            url: "RealizacaoPesquisa/Participacao/{idPesquisa}",
            defaults: new { controller = "RealizacaoPesquisa", action = "Participacao" }
        );

        routes.MapRouteWithName(
            name: "RealizacaoPesquisa_Participacao_Paciente",
            url: "RealizacaoPesquisa/ParticipacaoPaciente/{idPesquisa}/{nrProntuario}",
            defaults: new { controller = "RealizacaoPesquisa", action = "ParticipacaoPaciente" }
        );

        routes.MapRouteWithName(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

再次访问第一步时:http://localhost:61404/RealizacaoPesquisa 一切都很好;

进行第二步时:http://localhost:61404/RealizacaoPesquisa/Participacao/27 一切都还好;

但是当我到达第三步时:http://localhost:61404/RealizacaoPesquisa/ParticipacaoPaciente/27/0002642811 没有渲染面包屑痕迹。

任何帮助?

1 个答案:

答案 0 :(得分:1)

在这种情况下,您认为节点与路线不匹配是正确的。

路线

routes.MapRouteWithName(
    name: "RealizacaoPesquisa",
    url: "RealizacaoPesquisa/{action}/{idPesquisa}/{nrProntuario}/{id}",
    defaults: new { controller = "RealizacaoPesquisa", action = "Index", idPesquisa = UrlParameter.Optional, nrProntuario = UrlParameter.Optional, id = UrlParameter.Optional }
);

有5个参数。您只在节点中占其中的4个。如果您未将标记为UrlParameter.Optional的参数传递给路线,则您的路线仍会包含值为""的路线键。

Key     Value

id      ""

因此,为了使其匹配,您需要在PreservedRouteParameters中指定它。

<mvcSiteMapNode title="Paciente em Pesquisa" controller="RealizacaoPesquisa" action="ParticipacaoPaciente" preservedRouteParameters="idPesquisa;nrProntuario;id"/>

但是,您的路由也无效。只能使用1个可选参数,它必须始终是最右侧的参数。如果你不这样做,那么当你省略一个不是最右边值的可选参数时,路由框架就不会理解如何构建URL。

为了获得您想要的效果(我认为),您需要将其分解为至少2条路线。

routes.MapRouteWithName(
    name: "RealizacaoPesquisa1",
    url: "RealizacaoPesquisa/{action}/{idPesquisa}",
    defaults: new { controller = "RealizacaoPesquisa", action = "Index", idPesquisa = UrlParameter.Optional }
);

routes.MapRouteWithName(
    name: "RealizacaoPesquisa2",
    url: "RealizacaoPesquisa/{action}/{idPesquisa}/{nrProntuario}/{id}",
    defaults: new { controller = "RealizacaoPesquisa", action = "Index", id = UrlParameter.Optional }
);