ASP.NET MVC3:ActionMethod具有相同的名称和列表和详细信息视图的不同参数

时间:2011-12-25 19:06:48

标签: asp.net-mvc-3 asp.net-mvc-routing actionmethod controller-action

我有一个ProdcutsController我有2个Action方法。索引和细节。 索引将返回产品列表,详细信息将返回所选产品ID的详细信息。

所以我的网址就像

sitename/Products/   

将加载索引视图以显示产品列表。

 sitename/Products/Details/1234  

将加载详细信息视图以显示产品1234的详细信息。

现在我想避开第二个网址中的“详情”字样。所以它应该看起来像

   sitename/Products/1234 

我尝试将我的操作方法从“详细信息”重命名为“索引”,其中包含一个参数。但它向我显示错误“Method is is ambiguous

我试过这个

 public ActionResult Index()
{
    //code to load Listing view
}
public ActionResult Index(string? id)
{
    //code to load details view
}

我现在收到此错误

The type 'string' must be a non-nullable value type in order to use
it as parameter 'T' in the generic type or method 'System.Nullable<T>

意识到它不支持方法重载!我该如何处理?我应该更新我的路线定义吗?

3 个答案:

答案 0 :(得分:1)

使用此:

public ActionResult Index(int? id)
{
    //code to load details view
}

假设该值是整数类型。

这是另一种选择:

public ActionResult Index(string id)
{
    //code to load details view
}

string是一种引用类型,因此可以在不需要null的情况下为其分配Nullable<T>

答案 1 :(得分:0)

您可以使用一种Action方法。

类似的东西:

public ActionResult Index(int? Id)
{
  if(Id.HasValue)
  {
    //Show Details View
  }
  else
  {
    //Show List View
  }
}

答案 2 :(得分:0)

您可以创建两条路线并使用路线约束:

Global.asax中

        routes.MapRoute(
            "Details", // Route name
            "{controller}/{id}", // URL with parameters
            new { controller = "Products", action = "Details" }, // Parameter defaults
            new { id = @"\d+" }
        );

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

第一个路由有一个约束,要求id有一个或多个数字。由于这种约束,它不会捕获像~/home/about

的路由

的ProductsController

    public ActionResult Index()
    {
        // ...
    }

    public ActionResult Details(int id)
    {
        // ...
    }