【问题标题】:How to avoid "/Home" in the url如何避免 URL 中的“/Home”
【发布时间】:2015-03-29 14:21:18
【问题描述】:

我在 VS 2013 中使用标准的 MVC 模板。

使用默认设置,http://website/ 将被路由到网站/主页/索引。

如何直接在网站根 url 下路由所有“操作”,例如 http://website/xxx,以显示与 http://website/Home/xxx 相同的内容?例如,如何让http://website/About 在 Home 控制器中执行 About 操作?如果可能,解决方案不应该是 Http 重定向到 http://website/Home/About,因为我不想在 url 中显示“丑陋”的 Home/。

【问题讨论】:

  • 我已经删除了'basic q'部分,很明显这是一个问题:)

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


【解决方案1】:

对于这个问题,我找不到一个答案,它涵盖了一个面向公众的网站可能面临的所有问题,而又不费力地维护,同时仍然保持灵活性。

我最终想出了以下内容。它允许使用多个控制器,不需要任何维护,并使所有 URL 小写。

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        //set up constraints automatically using reflection - shouldn't be an issue as it only runs on appstart
        var homeConstraints = @"^(?:" + string.Join("|", (typeof(Controllers.HomeController)).GetMethods(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.DeclaredOnly).Select(x => (x.Name == "Index" ? "" : x.Name))) + @")$";

        //makes all urls lowercase, which is preferable for a public facing website
        routes.LowercaseUrls = true;

        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        //maps routes with a single action to only those methods specified within the home controller thanks to contraints
        routes.MapRoute(
            "HomeController",
            "{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new { action = homeConstraints }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

【讨论】:

    【解决方案2】:

    你可以像下面这样试试

    routes.MapRoute(
                    name: "MyAppHome",
                    url: "{action}/{wa}",
                    defaults: new { controller = "Home", action = "Index", wa = UrlParameter.Optional, area = "Admin" },
                    namespaces: new string[] { "MyApp.Controllers" }
                ).DataTokens = new RouteValueDictionary(new { area = "Admin" });
    

    在这里,您可能会注意到 Home 控制器是硬编码的,不再在请求中提供。你也可以使用RouteDebugger来玩路线。

    HTH

    【讨论】:

    • 您的代码中似乎有错误。我将 url 更改为“{action}/{wa}”,它给出了我想要的,即 website/About 将输出 website/Home/About 的内容。我一直想知道它是如何在 url:{A}/{B}/{C} 中知道 A 是什么,B 是什么。在 url:"{action}/{wa}" 为什么不认为 action 是控制器?
    • 它是由监督发布的。这是因为我们有一个控制器的默认值,并且 URL 是只接受动作和参数的模式
    • 谢谢。我的最后一个问题是:给定 url website/X,它怎么知道 X 应该是控制器还是动作?例如,网站/关于它应该映射到 /Home/About 还是应该映射到 /About/Index?
    • 我遇到了一个不需要的副作用。通过在内置文件中的默认 routes.MapRoute 之前添加上述代码,我丢失了所有其他 /Controller/Action url。例如 /Account/Login 现在给出 404。这是否意味着我必须为我拥有的每个控制器添加一个路由?
    • 你有控制器/动作的路由吗?否则,你可以切换到属性路由,你可以轻松控制
    猜你喜欢
    • 1970-01-01
    • 2022-10-31
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 2019-12-25
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多