0

ユーザーが利用できるようにしたい次の 2 つの URL があります。

/Account/Orders   <- This would should be a grid of all orders.
/Account/Orders/132   <- This would show this particular order information.

これが私の2つのActionMethodです:

[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 を渡す必要があるため、アクション メソッドは機能しません。

この場合、あなたは何を提案しますか?これは簡単なことのように思えますが、非常に長い (生産的な!) 1 日を過ごしましたが、ここまでしかできませんでした。

4

3 に答える 3

1

いくつかのオプション:

1) 最初に最も具体的なルートでルートを設定します

MapRoute("first", "/Accounts/Orders/{id}" ....
           controller="mycontroller" action="details"
MapRoute("second", "/Accounts/Orders .....
           controller="mycontroller" action="summary"

2) ルートの代わりに、署名の異なる 2 つの get メソッドがあります。

public ActionResult Index()
{
}

[ActionName("Index")] public ActionResult IndexDetails(int id) { }

ルーティングは

于 2012-04-07T02:42:17.067 に答える
1

デフォルトのルートを使用していると仮定すると、2 番目のOrderメソッドが呼び出されることはありません。ルートは、欠落しているidパラメーターが指定されていない場合は null 値を入力し、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);
}    
于 2012-04-07T02:06:54.273 に答える
0

2 つの異なるビューを持つことができます。1 つはグリッド用、もう 1 つは注文詳細用です。

次に、次のように呼び出すことができます。

return View("OrderGrid", Orders); // for grid

return View("OrderDetail", Order); // for detail
于 2012-04-07T01:42:57.907 に答える