我是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 }
);
答案 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:
之后的部分视为格式或模式:
您的3个网址Home/GetProducts
,Home/GetProductsByCode
和Home/Index
都符合此模式。
{action}部分分别为GetProducts
,GetProductsByCode
和Index
。
如果要将参数映射到Action中名为PageNo
或ProductCode
的变量,则需要利用路由,但一般情况下,您不需要为每种可能的组合设置路由。如果这些操作中的参数是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
的默认部分表示如果找不到代码库中存在的controller
和action
,请使用这些部分。它是一个后备,而不是功能驱动。
答案 2 :(得分:1)
asp.net无法理解最后一个参数是/ {ProductCode}"还是{ProductCode}",因为操作相同 - 所以你的网址看起来一样, 因此,只有第一个匹配,解决方案将使用完整的查询字符串,因为/ {id}只是查询字符串中id = 5的简写