【问题标题】:URL Routing MVC 5 Asp.netURL 路由 MVC 5 Asp.net
【发布时间】:2016-12-08 10:10:32
【问题描述】:

我知道 MVC 中的路由。我在 RouteConfig.cs 类的 RegisterRoute 方法下添加了一个新的 MapRoute,并使用 URL http://localhost:53363/package/PackageDetail/mypackage/5 成功调用了我的函数。

但是,我的问题是我必须为每种方法添加不同的地图路线还是有更好的方法?就像在 PackageController 类中一样,您可以看到我有两种方法,一种方法采用 PackageIdPackageName,另一种方法仅采用 PackageId .那么我是否必须注册不同的地图路线?

路由配置

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

            routes.MapRoute(
            name: "Package",
            url: "Package/PackageDetail/{packageName}/{packageId}",
            defaults: new { controller = "Package", action = "PackageDetail", packageName = UrlParameter.Optional, packageId = UrlParameter.Optional }

        );

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

PackageController.cs:

        [HttpGet]
        public ActionResult PackageListing(int packageId = 0)
        {

            return View();
        }

        [HttpGet]
        public ActionResult PackageDetail(string packageName = "", int packageId = 0)
        {

            return View();
        }

【问题讨论】:

  • 尝试在MVC 5中使用属性路由link
  • @MuhammedShevilKP 太好了,这就是我想要的。把它作为一个答案,这样我就可以接受它。

标签: c# asp.net asp.net-mvc asp.net-mvc-4 url-routing


【解决方案1】:

尽管 Muhammed 的回答会奏效,但它非常重复,尤其是当您为多种类型使用相同风格的路线时。

在决定采用单一路由方法之前,需要考虑一些事项。主要是为什么路由中同时有名称和ID?如果您想要一个对 SEO 更友好的 URL 结构,则根本不用担心 ID。

如果您在同一类型中有多个具有相同名称的产品,那么将名称作为 URL 的一部分是没有意义的,因为这样不会让用户自己去他们想去的地方。在这种情况下,只需离开原来的路线。

但是,如果您有多个不同的控制器(或操作),并且路由的名称/ID 结构相似,那么让您的自定义路由更通用会更好。

routes.MapRoute(
    name: "NameAndId",
    url: "{controller}/{action}/{name}/{id:int}",
    defaults: new 
        { 
            controller = "Package", 
            action = "PackageDetail", 
            name = UrlParameter.Optional, 
            id = UrlParameter.Optional 
        });

将此保留在默认路由之上,这不仅会重定向

/Package/PackageDetail/Deluxe/5

但也允许你拥有这样的东西:

/Meals/Menu/Dinner/3

这可能并不一定适用于你在这个项目中,但因为你正在学习 MVC,所以这是一个很好的技能。您能够维护您的路线定义越通用,您需要重复的就越少。当然,如果这是一次性特殊路线,使用属性也没什么问题。

同样要回答您的最后一个问题,您不需要创建另一个自定义路由,因为您的 PackageListing 方法将通过您创建项目时提供的默认路由进行路由。

【讨论】:

    【解决方案2】:

    如果你想覆盖默认路由 url 并生成自定义 url,那么你需要在路由配置文件中注册路由。

    您可以传递包名称和包 ID,如下所示。

    http://sitename/Package/PackageListing?packageId=1
    
    http://sitename/Package/PackageDetail?packageName=packagename&packageId=1
    

    但是如果你想生成如下的 URL,你需要在 route.config 文件中添加路由。

      http://sitename/Package/PackageListing/1 
    
     http://sitename/Package/PackageDetail/packageName/1 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-22
      • 2014-02-09
      • 2010-11-22
      • 2010-11-13
      相关资源
      最近更新 更多