MVCSitemap问题

时间:2015-01-25 04:36:20

标签: asp.net-mvc mvcsitemapprovider sitemapprovider

我在MVC Sitemap面临一个奇怪的问题。目前我最多有3个级别的站点地图链接,将来可能会有所变化。问题是中级站点地图链接不起作用(点击链接抛出错误 - Http 403.1 Forbidden)当我处于下一级但基本级别正常时。它发现URL不正确,区域和控制器名称只是弹出错过的动作名称。

EG:主页>公司>添加

在添加屏幕(最终级别)时,   - 点击Home重定向到localhost:xxxx / Home / index并正常工作。    

  • 点击公司重定向到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>

1 个答案:

答案 0 :(得分:0)

每当您收到错误消息“#34; Web服务器配置为不列出此目录的内容&#34;时,通常意味着在与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" }
        );
    }
}

如果操作名称是&#34;索引&#34;这将生成URL /Company/Company。和控制器名称是&#34;公司&#34;。

如果你的动作不是可选的,那么它会像你期望的那样工作。

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" }
        );
    }
}

由于操作名称是必需的,因此如果操作名称是&#34;索引&#34;则生成的URL将为/Company/Company/Index。和控制器名称是&#34;公司&#34;。