我有一个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>
意识到它不支持方法重载!我该如何处理?我应该更新我的路线定义吗?
答案 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)
{
// ...
}