1

我有一个 ProdcutsController,其中有 2 个 Action 方法。索引和详细信息。Index 将返回产品列表,Details 将返回所选产品 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>

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

4

3 回答 3

1

用这个:

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

假设值是整数类型。

这是另一种选择:

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

Astring是一个引用类型,因此 anull已经可以分配给它,而无需 a Nullable<T>

于 2011-12-25T19:09:10.397 回答
0

您可以只使用一种 Action 方法。

就像是:

public ActionResult Index(int? Id)
{
  if(Id.HasValue)
  {
    //Show Details View
  }
  else
  {
    //Show List View
  }
}
于 2011-12-25T19:12:40.557 回答
0

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

全球.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/aboutetc之类的路线。

产品控制器

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

    public ActionResult Details(int id)
    {
        // ...
    }
于 2011-12-25T21:15:03.430 回答