4

これは状況です:

ASP.NETMVC4アプリケーションがあります。アプリケーションを実行すると、ページに移動し、コントローラーのIndex-アクションがGuidasid-パラメーターを取ります。そのIDを使用して、データベースからアイテムのリストを取得し、それをViewModelに配置します。このViewModelは、すべてのアイテムをActionLinkとしてリストするビューに渡されます(必要に応じて変更できます)。アイテムの1つをクリックすると、選択したリンクのIDに基づいて他のアイテムのリストを取得し、最初のリストのすぐ横にこの新しいリストを表示します。

しかし、これは私の質問です(そして私が2日間立ち往生しているところ):これを行うための最良の方法は何ですか?新しいページに移動するか、部分ビューを使用します。私は両方を少し試してきたので、明らかにうまくいかなかったので、いくつか間違ったことをしたに違いありません。私はAJAXのものやそのようなヘルパーを必要としません、これを成し遂げるための正しい方法だけです... :)

前もって感謝します!

更新:私がすでに持っているコード

意見

@foreach (var order in Model.Orders)
{
    <p>@Html.ActionLink(order.Name,
                        "OrderItems",
                        "OrdersController",
                        new { id = order.Id },
                        null)
    </p>
}

@if (Model.Detail != null)
{
    @Html.Partial("_OrderItemsByOrder", Model)
}

コントローラ

public ActionResult Index(Guid id)
{
    var orders = Services.GetOrders(id);
    var viewModel = new OrdersViewModel { Orders = orders };
    return View(viewModel);
}

public ActionResult OrderItems(Guid id, OrdersViewModel model)
{
    var orderItems = Services.GetOrderLines(id);
    var viewModel = new OrdersViewModel
    {
        Orders = model.Orders,
        Detail = new OrderDetailViewModel { OrderItems = orderItems }
    };
    return PartialView(viewModel);
}
4

3 に答える 3

3

(ユーザーの使いやすさのために)AJAXを使用して、AJAX応答から「その他のアイテム」のリストをプルダウンすることをお勧めします(JSONの可能性が高い、またはJavaScriptを本当に避けたい場合は部分的なHTMLページ)

本当にAJAXを使用したくない場合は、すべてのアイテムとすべての「その他のアイテム」をプルして、最初に「非表示」フィールドに格納し、2つの選択ボックスを実行できます。

http://www.plus2net.com/javascript_tutorial/dropdown-list.php

例:http ://www.plus2net.com/javascript_tutorial/dropdown-list-demo.php

人々が各ドロップダウンを頻繁に使用する場合、またはオプションの数が非常に限られている場合を除いて、私は正直にAJAXオプションを使用します。

Ajax:http ://www.plus2net.com/php_tutorial/ajax_drop_down_list.php

そして、指摘したいのですが、選択/入力に使用されるドロップダウンボックスである必要はありません。コードを変更して、divまたは必要な要素を入力する必要があります:)

于 2011-11-10T15:02:30.013 に答える
2

このようなマスター/詳細ページを実現する方法はいくつかありますが、これを行うための最良の方法は実際にはありません。AJAXは最もエレガントでユーザーフレンドリーかもしれませんが、それは決して「正しい」答えではありません。

あなたが投稿したコードを見ると、あなたができる最も簡単なことは、1つのアクションメソッドと1つのビューを持つことです。

public class OrdersViewModel
{
    public IEnumerable<Order> Orders { get; set; }
    public OrderItems SelectedOrderItems { get; set; }
}

public ActionResult Orders(Guid id, Guid? orderId)
{
    var model = new OrdersViewModel();
    model.Orders = Services.GetOrders(id);

    if (orderId != null)
    {
        model.SelectedOrderItems = Services.GetOrderLines(orderId);
    }

    return View(model);
}

このかなり基本的なアプローチの欠点は、おそらく2つのGuidがUrlを汚してしまうことです。この例では、orderIdが実際に(ユーザー?)IDによって所有されていることを確認しません。最初のGuidが何を表しているかは関係ありません。ただし、これは数行のコードで処理できます。

これを処理するよりエレガントな方法は、URLの変更を気にしない場合は、2番目のアクション方法を使用することです。詳細自体から、またはこれをアクションメソッドに渡す必要のない方法で、注文の詳細の「所有者」を特定できることを願っています。これにより、ビューに適切なマスターの詳細のみが表示されるようになります。

public ActionResult OrderDetails(Guid id /*the id of the order*/)
{
    var orderLines = Services.GetOrderLines(id);

    var model = new OrdersViewModel();
    //ideally you could get to the "owner id" of the order from the order lines itself
    //depending on how your domain model is set up
    model.Orders = Services.GetOrders(orderLines.Order.OwnerId); 
    model.SelectedOrderItems = orderLines;

    return View("Orders", model); //render the same view as the Orders page if like
}

あなたの質問にリストされているあなたの見解は、ほとんど同じままである可​​能性があります。すべての注文を表すアクションリンクをレンダリングします。次に、モデルに注文の詳細がある場合は、注文の詳細をレンダリングします。

@if (Model.SelectedOrderItems!= null)
{
    /* markup here or a render partial call */
}

他のページで注文の詳細をレンダリングする場合は、マークアップを複製しないように、注文の詳細を部分的に表示することをお勧めします。ここでのみレンダリングされている場合は、このビューでマークアップを正しく表示できなかった理由は実際にはありません。

于 2011-11-10T18:45:27.657 に答える
1

私はこのようなものを提案します:

  1. アクション付きのコントローラーがあります。アクションは2つのパラメーターを取ります。1つはGUIDを使用し、もう1つは他のIDを使用してオプションです。
  2. あなたはあなたのアイテムをリストするあなたの「メインビュー」を持っています
  3. コントローラで、もう1つのアクションを追加します。今回は、1つのパラメータ(ID)のみを使用します。
  4. 別のビューを追加しますが、今回は、他のアイテムを一覧表示する部分的なビューです

アクション1は、ビューモデルにアイテムを含むリストと、他のアイテムをレンダリングするためのオプションのIDを配置します。

アクション3は、ビューモデルに他のいくつかのアイテムのリストを配置します

アクション1はビュー2をレンダリングし、アクション3はビュー4をレンダリングします。ビューモデルがそう言う場合、ビュー2はアクション3をレンダリングします。

基本的に、特定のアイテムが選択されていない場合、実行チェーンは次のようになります。1 =>2=>完了

ただし、アイテムを選択すると、チェーンは次のようになります。1 => 2 => 3 => 4

(もちろん、これは物事を行うための1つの方法にすぎません。)

于 2011-11-10T15:34:55.823 に答える