我无法弄清楚RouteConfig.cs文件

时间:2016-02-01 21:42:21

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

我是MVC的新手,并试图建立我的第一个网站。我无法正确设置RouteConfig文件。我有2条适用于不同ActionResults的规则。但是,只有其中一个正常工作。如果GetProducts高于GetProductByCode,则GetProducts可以正常工作。如果GetProductByCode位于GetProducts之上,则GetProductByCode可以正常工作。我究竟做错了什么?

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

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

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

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

我的解决方案如下

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

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

3 个答案:

答案 0 :(得分:3)

所有3条路线都是相同的,因为它们包含3个段(控制器名称,动作名称和可选参数),并且首先放置3个路段中的任何一个将永远被击中。

如果您希望点击GetProducts,则可以将定义修改为

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

虽然似乎没有真正的意义。如果您刚刚将GetProducts()GetProductByCode()中的参数名称更改为id,那么您需要的唯一路线定义是默认

答案 1 :(得分:3)

如果查看默认路线:

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

然后将url:之后的部分视为格式或模式:

  • {控制器}
  • {动作}
  • {ID}

您的3个网址Home/GetProductsHome/GetProductsByCodeHome/Index都符合此模式。

{action}部分分别为GetProductsGetProductsByCodeIndex

如果要将参数映射到Action中名为PageNoProductCode的变量,则需要利用路由,但一般情况下,您不需要为每种可能的组合设置路由。如果这些操作中的参数是id,那么它就可以正常工作而无需为每个参数创建路径。

E.g。

public ActionResult GetProducts(int id) 
{
 // stuff
}

public ActionResult GetProductsByCode(string id)
{
 // stuff
}

要获取参数名称,请明确指定控制器和操作:

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

    routes.MapRoute(
        name: "GetProductByCode",
        url: "Home/GetProductsByCode/{ProductCode}",
        defaults: new { controller = "Home", action = "GetProductByCode", ProductCode = UrlParameter.Optional }
    );

public ActionResult GetProducts(int PageNo) 
{
 // stuff
}

public ActionResult GetProductsByCode(string ProductCode)
{
 // stuff
}

但一般来说,只定义与普通{controller}/{action}/{id}模式不同的自定义路由。

MapRoute的默认部分表示如果找不到代码库中存在的controlleraction,请使用这些部分。它是一个后备,而不是功能驱动。

答案 2 :(得分:1)

asp.net无法理解最后一个参数是/ {ProductCode}"还是{ProductCode}",因为操作相同 - 所以你的网址看起来一样, 因此,只有第一个匹配,解决方案将使用完整的查询字符串,因为/ {id}只是查询字符串中id = 5的简写