我使用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
没有渲染面包屑痕迹。
任何帮助?
答案 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 }
);