1

インターネットを検索すると、同様の問題が見つかりましたが、プロジェクトの他の領域のノードでのみ発生します。

エラー

コントローラー プロセスのアクション carta_interveniencia を表すサイトマップ ノード Carta de Interveniência の URL を解決できませんでした。このサイトマップ ノードのルートを解決できること、およびそのデフォルト値で現在のサイトマップ ノードの 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 に答える