ASP.NET MVC MapRoute 多于 1 个参数问题
ASP.NET MVC MapRoute more than 1 parameter issue
我正在尝试将 MapRoute
与多个参数一起使用,但它无法正常工作。
我的RegisterRoutes
:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
"TestRoute", // Route name
"{controller}/{action}/{id}/{tID}", // URL with parameters
new { controller = "Test", action = "Index", id = "", tID = "" } // Parameter defaults
);
}
我的测试控制器:
public class TestController : Controller
{
public ActionResult Index(int? id, int? tID)
{
// Some code to create viewModel
return View(viewModel);
}
}
我从 Html.ActionLink
:
调用这个方法
@Html.ActionLink(@item.Description, "Index", "Test",
new { id = @item.CatID, tID = @item.myTID }, null)
但是,它 returns 将 url 作为:/Test/Index/3?tID=264981
而不是 /Test/Index/3/264981
有人知道我做错了什么吗?
这里有几个问题:
- 应先注册更具体的路线,然后再注册一般路线。
- 由于首场比赛总是获胜,路线需要以某种方式约束。例如,为了避免在路由B之前注册的路由A匹配应该由路由B处理的情况。
- 最合乎逻辑的行为通常是使路由值成为必需的,而不是可选的。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// Register the most specific route first
routes.MapRoute(
"TestRoute",
// Constrain the URL - the simplest way is just to add a literal
// segment like this, but you could make a route constraint instead.
"Test/{action}/{id}/{tID}",
// Don't set a value for id or tID to make these route values required.
// If it makes sense to use /Test/Action without any additional segments,
// then setting defaults is okay.
new { controller = "Test", action = "Index" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
参考:
我正在尝试将 MapRoute
与多个参数一起使用,但它无法正常工作。
我的RegisterRoutes
:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
"TestRoute", // Route name
"{controller}/{action}/{id}/{tID}", // URL with parameters
new { controller = "Test", action = "Index", id = "", tID = "" } // Parameter defaults
);
}
我的测试控制器:
public class TestController : Controller
{
public ActionResult Index(int? id, int? tID)
{
// Some code to create viewModel
return View(viewModel);
}
}
我从 Html.ActionLink
:
@Html.ActionLink(@item.Description, "Index", "Test",
new { id = @item.CatID, tID = @item.myTID }, null)
但是,它 returns 将 url 作为:/Test/Index/3?tID=264981
而不是 /Test/Index/3/264981
有人知道我做错了什么吗?
这里有几个问题:
- 应先注册更具体的路线,然后再注册一般路线。
- 由于首场比赛总是获胜,路线需要以某种方式约束。例如,为了避免在路由B之前注册的路由A匹配应该由路由B处理的情况。
- 最合乎逻辑的行为通常是使路由值成为必需的,而不是可选的。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// Register the most specific route first
routes.MapRoute(
"TestRoute",
// Constrain the URL - the simplest way is just to add a literal
// segment like this, but you could make a route constraint instead.
"Test/{action}/{id}/{tID}",
// Don't set a value for id or tID to make these route values required.
// If it makes sense to use /Test/Action without any additional segments,
// then setting defaults is okay.
new { controller = "Test", action = "Index" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
参考: