【问题标题】:MVCSitemap IssueMVC站点地​​图问题
【发布时间】:2015-01-25 04:36:19
【问题描述】:

我在使用 MVC 站点地图时遇到了一个奇怪的问题。目前我最多有 3 个级别的站点地图链接,将来可能会发生变化。问题是中级站点地图链接不起作用(单击链接抛出错误 - Http 403.1 Forbidden) 当我处于下一个级别但基本级别正在工作时。发现URL不正确,比如Area和Contoller名称只是弹出了漏掉的action名称。

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>

【问题讨论】:

    标签: asp.net-mvc mvcsitemapprovider sitemapprovider


    【解决方案1】:

    每当您收到“Web 服务器已配置为不列出此目录的内容”的错误消息时,通常意味着在与 URL 相同的位置有一个物理目录,该目录优先于它。换句话说,&lt;website_root_directory&gt;\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" }
            );
        }
    }
    

    如果操作名称为“Index”且控制器名称为“Company”,这将生成 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" }
            );
        }
    }
    

    由于需要操作名称,如果操作名称为“Index”且控制器名称为“Company”,则生成的 URL 将为 /Company/Company/Index

    【讨论】:

    • 谢谢兄弟!!!您为我节省了一百万美元的时间,我发现这不是 MVCSitemap 的问题,所有问题都与路由有关,但没有解决。但是在这方面需要更多更新,请按照以下答案进行操作,并请帮助说明为什么它不起作用,我之前尝试过并成功了。
    猜你喜欢
    • 2011-04-17
    • 2011-06-07
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    相关资源
    最近更新 更多