我想要向用户提供这两个网址:
/Account/Orders <- This would should be a grid of all orders.
/Account/Orders/132 <- This would show this particular order information.
以下是我的两个ActionMethods:
[Authorize]
public ActionResult Orders(int id)
{
using (var orderRepository = new EfOrderRepository())
using (var accountRepository = new EfAccountRepository())
{
OrderModel model = new OrderModel();
return View(model);
}
}
[Authorize]
public ActionResult Orders()
{
using (var orderRepository = new EfOrderRepository())
using (var accountRepository = new EfAccountRepository())
{
List<OrderModel> model = new List<OrderModel>();
return View(model);
}
}
如果我的Orders视图是强类型的,OrderModel
作为模型,Orders()
动作方法将无效,因为我需要传递一个IEnumerable而不是单个对象。
在这种情况下你有什么建议?这似乎很容易做到,但我已经度过了很长时间(富有成效!),但我只能走这么远。
答案 0 :(得分:1)
假设您使用的是默认路由,则永远不会调用您的第二个Order
方法。如果没有提供空值,路由将填充缺少的id
参数,并尝试使用id
参数调用重载。
您可以更改路线或做其他事情来尝试解决此问题,但更快的选择是在路由系统中工作:
public ActionResult Orders(int id = -1)
{
return id == -1 ? this.OrdersSummary() : this.OrdersDetail(id);
}
private ActionResult OrdersSummary()
{
var model = new SummaryModel();
// fill in model;
return this.View("OrdersSummary", model);
}
private ActionResult OrdersDetail(int id)
{
var model = new DetailModel();
// fill in model;
return this.View("OrderDetail", model);
}
答案 1 :(得分:1)
有两种选择:
1)首先使用最具体的路线设置您的路线
MapRoute("first", "/Accounts/Orders/{id}" ....
controller="mycontroller" action="details"
MapRoute("second", "/Accounts/Orders .....
controller="mycontroller" action="summary"
2)而不是路由有两个具有不同签名的get方法:
public ActionResult Index()
{
}
[ActionName( “索引”)] public ActionResult IndexDetails(int id) { }
路由应与
匹配答案 2 :(得分:0)
您可以有两种不同的观点。一个用于网格,一个用于订单详细信息。
然后你可以像这样打电话给他们:
return View("OrderGrid", Orders); // for grid
return View("OrderDetail", Order); // for detail