在这种情况下,对控制器如何实际映射到视图感到困惑

时间:2012-04-07 01:36:16

标签: c# asp.net-mvc-3 actionmethod

我想要向用户提供这两个网址:

/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而不是单个对象。

在这种情况下你有什么建议?这似乎很容易做到,但我已经度过了很长时间(富有成效!),但我只能走这么远。

3 个答案:

答案 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