【问题标题】:MVC3 Areas how to use dashes in page namesMVC3 区域如何在页面名称中使用破折号
【发布时间】:2012-03-06 15:55:15
【问题描述】:

我们在一个项目中使用区域。我们还使用此修复来替换页面名称中的破折号

 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}') 未指定命名空间来搜索与请求匹配的控制器,则可能会发生这种情况。如果是这种情况,请通过调用采用“命名空间”参数的“MapRoute”方法的重载来注册此路由。

我们有多个名称相同但内容不同的“细分”来定位细分受众

【问题讨论】:

    标签: asp.net asp.net-mvc-3


    【解决方案1】:

    以下应该在您的区域注册中起作用:

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

    您可能需要调整约束中的命名空间以匹配您的。

    【讨论】:

    • 这就是我重写它的方式,但它似乎不起作用。我得到一个 404。在名称中使用 _ 时我仍然可以访问该页面,但 - 版本给了我一个 404。
    • 实际上我得到了一个错误。我正在编辑帖子,以便您查看。
    • @ddilsaver,看起来您在多个区域中定义了相同的控制器。您将需要使用命名空间约束来解决这些冲突。我更新了我的帖子来说明如何实现这一点。
    • 它现在忽略了区域并在根视图文件夹中查找我的“区域”文件夹。示例 ~/Views/segment/Index 是它正在做的事情,而不是 ~/Area/segment/index
    • @ddilsaver,确实,我在 AreaRegistration 中注册路线时错过了一个非常重要的细节。 Area 数据令牌。我已经更新了我的帖子来解决这个问题。现在应该可以工作了。
    猜你喜欢
    • 1970-01-01
    • 2011-11-05
    • 2013-02-04
    • 2011-12-17
    • 2016-01-28
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 2013-06-11
    相关资源
    最近更新 更多