QueryString id参数未被使用

时间:2010-01-27 10:20:04

标签: asp.net-mvc asp.net-mvc-routing

我有一个非常基本的ASP.Net MVC项目,我想在我的一个控制器操作上使用id的参数名称。从我读过的所有内容都不应该是一个问题,但由于某些原因,使用id的参数名称无法获取从查询字符串中提取的值,但如果我将其更改为任何其他不同的名称,它将起作用。

我的global.asx只有一条路线

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

我的控制器方法是:

public ActionResult Confirm(string id)
{
     ....
}

http://mysite/customer/confirm/abcd的网址有效。网址http://mysite/customer/confirm?id=abcd失败。

如果我将控制器方法更改为:

public ActionResult Confirm(string customerID)
{
     ....
}

然后http://mysite/customer/confirm?customerID=abcd的网址有效。

在ASP.Net MVC查询字符串中使用“id”作为参数有什么特别之处吗?

更新:将id从1234更改为abcd,我的id实际上是字符串。

2 个答案:

答案 0 :(得分:1)

如果您需要在查询字符串中包含id,则不要使用'id'参数创建路由。 如果您有路由"{controller}/{action}",那么您可以使用public ActionResult Confirm(string id)作为控制器方法。

路由不关心查询字符串。

答案 1 :(得分:1)

如果你没有应用id参数(querystring或POST),系统会忽略它,你可以删除控制器中的“id”参数:

public ActionResult Confirm()

在您的情况下,您只需坚持使用id参数。当id被自动“映射”时,为什么要创建一个丑陋的customerID参数?

这是使用id参数的一个简单而简单的例子。

public ActionResult Confirm(int? id)
{
     if (id.HasValue && id.Value > 0) // check the id is actually a valid int
         _customerServer.GetById(id.Value);

    // do something with the customer

    return View();
}

这也适用于我。我们现在正在申请中使用标准路线:

public ActionResult Confirm(string id)
{
     if (!string.IsNullOrEmpty(id)) // check the id is actually a valid string
         _customerServer.GetByStringId(id);

    // do something with the customer

    return View();
}