Asp.net MVC3区域如何在页面名称中使用破折号
我们在项目中使用区域。我们还使用此修复程序替换页面名称中的破折号Asp.net MVC3区域如何在页面名称中使用破折号,asp.net,asp.net-mvc-3,Asp.net,Asp.net Mvc 3,我们在项目中使用区域。我们还使用此修复程序替换页面名称中的破折号 routes.Add( new Route("{controller}/{action}/{id}", new RouteValueDictionary( new { controller = "Home", action = "Index", id = UrlParameter.Optional }),
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”)]重命名页面,但这并不能解决控制器仍然有下划线区域/some_文件夹/some page的问题,我不希望我的URL看起来像这样
编辑:
当我使用Darin Dimitrov建议的路线时,会出现以下错误:
找到多个与名为“page”的控制器匹配的类型。如果为该请求提供服务的路由('admin/{controller}/{action}/{id}')未指定名称空间来搜索与该请求匹配的控制器,则可能发生这种情况。如果是这种情况,请通过调用采用“namespaces”参数的“MapRoute”方法的重载来注册此路由
我们有多个名称相同但内容不同的“细分市场”,以细分市场受众为目标以下内容应适用于您的区域注册:
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()
)
);
}
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()
)
);
}
更新: 在多个区域中,您似乎拥有相同的控制器名称,如果不定义名称空间约束,在注册路由时,这是不可能的,因为收到的错误消息建议您这样做 因此,在您的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()
)
);
}
在您的注册区域:
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()
)
);
}
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()
)
);
}
您可能需要调整约束中的名称空间以匹配您的名称空间。我就是这样重写的,但它似乎不起作用。我有一个404。在名称中使用u时,我仍然可以访问该页面,但是-版本给了我404。实际上,我得到了一个错误。我正在编辑这篇文章,以便您能看到它。@DdlSaver,看起来您在多个区域中定义了相同的控制器。您需要使用名称空间约束来解决这些冲突。我已经更新了我的帖子来说明如何实现这一点。它现在忽略了区域,并在根视图文件夹中查找我的“区域”文件夹。示例~/Views/segment/Index是它所做的,而不是~/Area/segment/index@ddilsaver,事实上,在区域注册中注册路线时,我错过了一个非常重要的细节。
区域
数据令牌。我已经更新了我的帖子来解决这个问题。现在应该可以工作了。