1

在互联网上搜索我发现了一个类似的问题,但我的问题只发生在项目其他区域的节点上。

错误

无法解析站点地图节点 Carta de Interveniência 的 URL,它表示控制器进程中的操作 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" }
        );
    }
}
4

1 回答 1

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;
于 2012-12-13T16:36:44.677 回答