0

MVC サイトマップで奇妙な問題に直面しています。現在、サイトマップ リンクは最大 3 レベルで、将来変更される可能性があります。問題は、次のレベルにいるときに中間レベルのサイトマップ リンクが機能しないことです (リンクをクリックするとエラーが発生します - Http 403.1 Forbidden)。URL が適切ではないことがわかりました。たとえば、Area と Controller の名前が、見逃したアクション名だけをポップアップ表示するだけです。

例: ホーム>会社>追加

[追加] 画面 (最終レベル) で、[ホーム] をクリックすると、localhost:xxxx/Home/index にリダイレクトされ、正常に動作します。

  • Company をクリックすると、localhost:xxxx/Company/Company にリダイレクトされ、そこから localhost:xxxx/Company/Company/index にリダイレクトされることが期待されます

次のエラーが発生します。

ローカルホスト:xxxx/会社/会社/

HTTP エラー 403.14 - 許可されていません Web サーバーは、このディレクトリの内容を一覧表示しないように構成されています。最も可能性の高い原因: • 要求された URL に対して既定のドキュメントが構成されておらず、ディレクトリの参照がサーバーで有効になっていません。

MVC.Sitemap の詳細は次のとおりです。

<?xml version="1.0" encoding="utf-8" ?>
<mvcSiteMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0"
    xsi:schemaLocation="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0 MvcSiteMapSchema.xsd">

<mvcSiteMapNode key="Home" title="Home" controller="Home" action="Index">
<mvcSiteMapNode key="Company" title="Company" area="Company" controller="Company" action="Index">
  <mvcSiteMapNode key="CompanyAdd" title="Add Company" area="Company" controller="Company" action="Add" />
</mvcSiteMapNode>
</mvcSiteMapNode>

</mvcSiteMap>
4

1 に答える 1

0

「Web サーバーは、このディレクトリの内容を一覧表示しないように構成されています」というエラーが表示される場合は、通常、URL と同じ場所に物理ディレクトリがあり、それが優先されていることを意味します。つまり、その場所には既にフォルダーがあり<website_root_directory>\Company\Company\、同じ URL を持つコントローラーへの呼び出しよりも優先されます。

もう 1 つの問題は、Company エリアのルーティングを設定した方法によるものです。オプションのアクション名があり、アクション名に構成された値がオプションの値と同じである場合、URL が生成されるときに除外されます。

public class CompanyAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Company";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Company_default",
            "Company/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional },
            new string[] { "MyRootNamespace.Areas.Company.Controllers" }
        );
    }
}

/Company/Companyアクション名が「Index」でコントローラー名が「Company」の場合、これにより URL が生成されます。

アクションをオプションにしないと、期待どおりに動作します。

public class CompanyAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Company";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Company_default",
            "Company/{controller}/{action}/{id}",
            // Action was removed as an optional parameter
            new { id = UrlParameter.Optional },
            new string[] { "MyRootNamespace.Areas.Company.Controllers" }
        );
    }
}

アクション名が必要なため、生成されるURL/Company/Company/Indexはアクション名が「Index」でコントローラー名が「Company」の場合となります。

于 2015-01-25T11:20:06.350 に答える