我们正在使用带有项目的区域。我们也使用此修补程序替换页面名称中的破折号
routes.Add(
new Route("{controller}/{action}/{id}",
new RouteValueDictionary(
new { controller = "Home", action = "Index", id = UrlParameter.Optional }),
new HyphenatedRouteHandler())
);
public class HyphenatedRouteHandler : MvcRouteHandler
{
protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
{
requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", "_");
requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_");
return base.GetHttpHandler(requestContext);
}
}
此修复程序适用于普通的顶级页面。首页/一些页。 但是当涉及到一个区域时,它就不再起作用了。我尝试将AreaRegistration.cs文件修改为与Global.asax.cs路由等效,但这也不起作用。我可以用[ActionName(“some-page”)]重命名页面但是它没有解决控制器仍然有下划线Area / some_folder / some-page的问题,我不希望我的URL看起来像那样。
修改 当我使用Darin Dimitrov建议的路线时,我得到了这个错误:
找到了与名为“page”的控制器匹配的多个类型。如果为此请求提供服务的路由('admin / {controller} / {action} / {id}')未指定名称空间来搜索与请求匹配的控制器,则会发生这种情况。如果是这种情况,请通过调用带有'namespaces'参数的'MapRoute'方法的重载来注册此路由。
我们有多个“细分”,它们具有相同的名称但内容不同,以定位细分受众群
答案 0 :(得分:3)
以下内容适用于您的区域注册:
public override void RegisterArea(AreaRegistrationContext context)
{
context.Routes.Add(
"Admin_default",
new Route("Admin/{controller}/{action}/{id}",
new RouteValueDictionary(
new { action = "Index", id = UrlParameter.Optional }
),
null,
new RouteValueDictionary(
new
{
area = AreaName
}
),
new HyphenatedRouteHandler()
)
);
}
更新:
您似乎在多个区域中具有相同的控制器名称,这在注册路由时未定义命名空间约束是不可能的,因为您收到的错误消息建议您这样做。
所以你的Global.asax:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add(
"Default",
new Route(
"{controller}/{action}/{id}",
new RouteValueDictionary(
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
),
null,
new RouteValueDictionary(
new { Namespaces = new[] { "AppName.Controllers" } }
),
new HyphenatedRouteHandler()
)
);
}
并在您的AreaRegistration中:
public override void RegisterArea(AreaRegistrationContext context)
{
context.Routes.Add(
"Admin_default",
new Route(
"Admin/{controller}/{action}/{id}",
new RouteValueDictionary(
new { action = "Index", id = UrlParameter.Optional }
),
null,
new RouteValueDictionary(
new
{
Namespaces = new[] { "AppName.Areas.Admin.Controllers" },
area = AreaName
}
),
new HyphenatedRouteHandler()
)
);
}
您可能需要调整约束中的命名空间以匹配您的命名空间。