MVCSitemap Issue

Я столкнулся со странной проблемой с MVC Sitemap. В настоящее время у меня было максимум 3 уровня ссылок на карту сайта, которые могут измениться в будущем. Проблема в том, что ссылка на карту сайта среднего уровня не работает (щелчок по ошибке выброса ссылки - Http 403.1 Forbidden), когда я на следующем уровне, но базовый уровень работает. Он обнаружил, что URL не является правильным, так как имя Area и Contoller отображает только пропущенное имя действия.

EG: Home> Компания> Добавить

Когда на экране Add (последний уровень), - нажатие на Home перенаправляет на localhost:xxxx/Home/index и работает нормально.

  • нажав на перенаправления Company на localhost:xxxx/Company/Company, куда ожидается перенаправление на localhost:xxxx/Company/Company/ index

и приводит к следующей ошибке,

локальный: хххх / Компания / О компании /

Ошибка HTTP 403.14 - Запрещено Веб-сервер настроен так, чтобы не перечислять содержимое этого каталога. Наиболее вероятные причины: • Документ по умолчанию не настроен для запрошенного 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>

2 ответа

Решение

Всякий раз, когда вы получаете сообщение об ошибке "Веб-сервер настроен на отсутствие списка содержимого этого каталога", это обычно означает, что в том же расположении, что и URL-адрес, находится физический каталог, который имеет приоритет над ним. Другими словами, там уже есть папка <website_root_directory>\Company\Company\ и это имеет приоритет над вызовом к контроллеру с тем же URL.

Другая проблема, с которой вы столкнулись, связана с тем, как вы настроили свой маршрут для зоны компании. Если у вас есть необязательное имя действия, а настроенное значение для имени действия совпадает с необязательным значением, оно будет пропущено при создании 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" }
        );
    }
}

Это сгенерирует URL /Company/Company если имя действия - "Индекс", а имя контроллера - "Компания".

Если вы сделаете действие необязательным, оно будет работать так, как вы ожидаете.

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 если имя действия - "Индекс", а имя контроллера - "Компания".

В промежутке я пытался добавить еще один маршрут, чтобы избавиться от того, что я делал ранее и добился успеха, но здесь это не сработало. Почему этот материал ниже не работает сейчас?

public override void RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(
            "Company", 
            "Company", 
            defaults: new { controller = "Company", action = "Index" });

    context.MapRoute(
        "Company_default",
        "Company/{controller}/{action}/{id}",
        // Action was removed as an optional parameter
        new { id = UrlParameter.Optional }
    );
}
Другие вопросы по тегам