无法解析区域中的站点地图节点的URL

时间:2012-10-18 11:34:06

标签: asp.net-mvc-4 sitemap mvcsitemapprovider

搜索互联网I found a similar problem,但我的搜索只发生在项目其他区域的节点上。

错误

  

无法解析站点地图节点CartadeInterveniência的URL   表示控制器processo中的action carta_interveniencia。确保   可以解析此站点地图节点的路由及其路径   默认值允许解析当前站点地图节点的URL。

网页

<mvcSiteMapNode title="Cadastros" clickable="false" roles="*" >

    <mvcSiteMapNode title="Processos" controller="processos" action="index">
        <mvcSiteMapNode title="Novo" action="novo" />
        <mvcSiteMapNode title="Editar" action="editar" dynamicNodeProvider="CreditoImobiliarioBB.Web.Infra.Sitemap.ProcessosDynamicNodeProvider, CreditoImobiliarioBB.Web" />
        <mvcSiteMapNode title="Detalhes" action="detalhes" preservedRouteParameters="id" dynamicNodeProvider="CreditoImobiliarioBB.Web.Infra.Sitemap.ProcessosDynamicNodeProvider, CreditoImobiliarioBB.Web">
            <mvcSiteMapNode title="Documentos" key="ProcessoDocumentos2" clickable="false" area="Documentos" controller="processo">
                <mvcSiteMapNode title="Carta de Interveniência" preservedRouteParameters="id" action="carta_interveniencia"></mvcSiteMapNode>
            </mvcSiteMapNode>
        </mvcSiteMapNode>

    </mvcSiteMapNode>

区域注册

public class DocumentosAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Documentos";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            name: "Documentos",
            url: "{controller}/{id}/documento/{action}",
            defaults: null,
            constraints: new { id = @"^\d+$" },
            namespaces: new string[] { "CreditoImobiliarioBB.Web.Areas.Documentos" }
        );
    }
}

1 个答案:

答案 0 :(得分:2)

解析器的默认实现以这种方式运行。它会尝试根据您的站点地图中的确切位置找到路线。由于您的站点地图没有id参数,并且您对此有约束,因此找不到路由,并且解析程序抛出异常。但是,解析器在加载站点地图时必须解析每个URL是没有理由的。

您可以创建自己的解析程序并将其注册到站点地图。将默认值复制并粘贴到您自己的类中。在默认代码的底部附近是:

if (string.IsNullOrEmpty(returnValue))
{
    throw new UrlResolverException(string.Format(Messages.CouldNotResolve, mvcSiteMapNode.Title, action, controller, mvcSiteMapNode.Route ?? ""));
}

 _urlkey = key;
_url = returnValue;
return returnValue;

将该代码更改为:

if (string.IsNullOrEmpty(returnValue))
{
    return Guid.NewGuid().ToString();
}

 _urlkey = key;
_url = returnValue;
return returnValue;