从路由

时间:2018-02-24 12:40:30

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

这是我的默认路线:

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

我希望能够获得id参数。

这是控制器:

public ActionResult Index(int page = 1)
{
    var cars = repositoryManager.CarRepository.GetAll().Skip(page).Take(1).ToList();
    return View(cars);
}

事情是我进入时: /home/index/5 page仍为1。为什么?仅当page是默认参数时,1才会<xsl:apply-templates select="Term/Ext[@name = 'demo']"/>

2 个答案:

答案 0 :(得分:1)

page为1,因为您传递的id为5而非page,因此page将获得其默认值1。

如果您将page的名称更改为id您的代码有效,但这不是一个好的命名!

public ActionResult Index(int id = 1)
{
    var cars = repositoryManager.CarRepository.GetAll().Skip(id).Take(1).ToList();
    return View(cars);
}

您还可以将page作为查询字符串/home/index?page=5

发送

答案 1 :(得分:0)

动作参数由Value Providers传递给动作方法。当键(参数的名称)与值源中的键匹配时,这些提供程序通过提供操作方法参数来工作。路由值和查询字符串都有值提供程序,但无论它们从传入的密钥中提取数据的位置都必须与数据源的密钥匹配。

路由值的默认路由中定义的键是controlleractionid

url: "{controller}/{action}/{id}"

但是,您在操作方法中定义的键是page

public ActionResult Index(int page = 1)

由于该源中没有名为page的密钥,因此路由值不会将任何值传递到您的操作方法,并且它将继续尝试其他来源,例如查询字符串。如果在任何值提供程序中找不到名为page的值,则该值将为空,因此将使用您的默认操作方法值。

最简单的解决方法是将操作方法​​中的密钥重命名为id

public ActionResult Index(int id = 1)

或者,创建一个专门的路线并将密钥传递为page而不是id

routes.MapRoute(
    name: "DefaultWithPage",
    url: "Home/Index/{page}",
    defaults: new { controller = "Home", action = "Index" }
);

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