【问题标题】:Why on compile MVC starts on the wrong controller?为什么在编译 MVC 时在错误的控制器上启动?
【发布时间】:2012-07-18 04:27:56
【问题描述】:

我有一个名为 HomeController 的控制器、一个名为 Home 的文件夹和一个名为 Index 的视图。我还有另一个名为 TestEditController 的控制器、一个名为 TestEdit 的文件夹和一个名为 Index 的视图。出于某种原因,当我编译它时,URL:http://localhost:4097/ 并不指向 Home/Index,而是指向 TestEdit/Index。我去了属性>开始操作>特定页面...并将文本框留空。注意:放置/ 不起作用。我已经清理、构建、重建项目/解决方案。但仍然遇到同样的问题。这是我的 Global.asax 文件:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "SectionsData", // Route name
            "{controller}/{action}/{id}/{prodno}/{instid}/{section}", // URL with parameters
            new { controller = "TestEdit", action = "Sections", id = UrlParameter.Optional, prodno = UrlParameter.Optional, instid = UrlParameter.Optional, section = UrlParameter.Optional } // Parameter defaults
        );

        routes.MapRoute(
            "Sections", // Route name
            "{controller}/{action}/{id}/{prodno}/{instid}", // URL with parameters
            new { controller = "TestEdit", action = "Index", id = UrlParameter.Optional, prodno = UrlParameter.Optional, instid = UrlParameter.Optional } // Parameter defaults
        );

        routes.MapRoute(
            "MainProducts", // Route name
            "{controller}/{action}/{id}/{prodno}", // URL with parameters
            new { controller = "Home", action = "Main", id = UrlParameter.Optional, prodno = UrlParameter.Optional  } // Parameter defaults
        );

        routes.MapRoute(
            "Catalogs", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Products", id = UrlParameter.Optional } // Parameter defaults
        );

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

    }

【问题讨论】:

  • 路线将采用第一个匹配项。由于 TestEdit 路由的所有 URL 参数都是可选的,因此它首先匹配。

标签: asp.net-mvc asp.net-mvc-3 visual-studio-2010


【解决方案1】:

你的匹配太笼统了。试试这个:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "SectionsData", // Route name
        "TestEdit/Sections/{id}/{prodno}/{instid}/{section}", // URL with parameters
        new { controller = "TestEdit", action = "Sections", id = UrlParameter.Optional, prodno = UrlParameter.Optional, instid = UrlParameter.Optional, section = UrlParameter.Optional } // Parameter defaults
    );

    routes.MapRoute(
        "Sections", // Route name
        "TestEdit/Index/{id}/{prodno}/{instid}", // URL with parameters
        new { controller = "TestEdit", action = "Index", id = UrlParameter.Optional, prodno = UrlParameter.Optional, instid = UrlParameter.Optional } // Parameter defaults
    );

    routes.MapRoute(
        "MainProducts", // Route name
        "Home/Main/{id}/{prodno}", // URL with parameters
        new { controller = "Home", action = "Main", id = UrlParameter.Optional, prodno = UrlParameter.Optional  } // Parameter defaults
    );

    routes.MapRoute(
        "Catalogs", // Route name
        "Home/Products/{id}", // URL with parameters
        new { controller = "Home", action = "Products", id = UrlParameter.Optional } // Parameter defaults
    );

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );

}

...但实际上,您并不需要很多这样的路线。

【讨论】:

  • 哦。真的吗?你认为我应该拥有或真正需要多少?
  • 嗯,Catalogs 和 MainProducts 会用默认路由正确处理,Sections 和 SectionsData 可以合并到一个路由中。
  • 但是如果我让默认路由(按原样)处理它,prodno 不会最终成为查询字符串吗?
  • 哇!是的,我错过了。但是你可以通过在你的默认路由中引用它来解决这个问题。
【解决方案2】:

因为 SectionsData 和 Sections Route 的所有其他参数都是可选的,所以它们会在默认路由之前匹配。

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 2017-05-06
    • 2013-03-11
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    相关资源
    最近更新 更多