MVC站点地图问题
MVCSitemap Issue
我在使用 MVC 站点地图时遇到了一个奇怪的问题。目前我最多有 3 个级别的站点地图 link,这可能会在未来发生变化。问题是 中级站点地图 link 不工作(点击 link 抛出错误 - Http 403.1 Forbidden) 当我在下一级但是基本级别正在工作。发现URL不对,比如Area和Contoller name只弹出action name漏掉了
EG: 主页>公司>添加
在添加屏幕(最终关卡)时,
- 点击 Home 重定向到 localhost:xxxx/Home/index 并且工作正常。
点击公司重定向到 localhost:xxxx/Company/Company 预计重定向到 localhost:xxxx/Company/Company/index
并导致以下错误,
本地主机:xxxx/Company/Company/
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>
每当您收到 "The Web server is configured to not list the contents of this directory" 错误时,通常意味着在与 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" }
);
}
}
如果动作名称是 "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
。
我在使用 MVC 站点地图时遇到了一个奇怪的问题。目前我最多有 3 个级别的站点地图 link,这可能会在未来发生变化。问题是 中级站点地图 link 不工作(点击 link 抛出错误 - Http 403.1 Forbidden) 当我在下一级但是基本级别正在工作。发现URL不对,比如Area和Contoller name只弹出action name漏掉了
EG: 主页>公司>添加
在添加屏幕(最终关卡)时, - 点击 Home 重定向到 localhost:xxxx/Home/index 并且工作正常。
点击公司重定向到 localhost:xxxx/Company/Company 预计重定向到 localhost:xxxx/Company/Company/index
并导致以下错误,
本地主机:xxxx/Company/Company/
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>
每当您收到 "The Web server is configured to not list the contents of this directory" 错误时,通常意味着在与 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" }
);
}
}
如果动作名称是 "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
。