2011-11-10 170 views
4

這種情況:新視圖或局部視圖

我有一個ASP.NET MVC 4應用程序。當我運行該應用程序時,我轉到一個頁面,並且控制器上的Index - action採用Guid作爲id - 參數。使用該ID,我從數據庫中獲取項目列表並將其放入ViewModel中。這個ViewModel被傳遞給一個視圖,它將所有的項目列爲一個ActionLink(如果需要可以更改)。當我點擊其中一個項目時,我想根據所選鏈接的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); 
} 
+0

我對你正試圖返回給用戶的東西有點困惑。您是否試圖返回訂單列表,然後能夠點擊/選擇它們並查看該訂單的詳細信息? – John

回答

2

有幾種方法可以實現這樣的主/明細頁面,但實際上沒有最好的方法來做到這一點。 AJAX可能是最優雅和用戶友好的,但它絕不是「正確」的答案。

看着你發佈的代碼,你可以做的最簡單的事情是有一個操作方法和一個視圖。

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弄髒了您的網址,這個例子不確認將訂單實際上是由(用戶?)ID擁有的 - 無論第一個Guid代表。儘管你可以用幾行代碼來處理這個問題。

如果你不介意你的Url改變,處理這個更優雅的方法是堅持第二個操作方法。我希望你可以從細節本身確定訂單細節的「所有者」,或者以某種不需要你將其傳遞給操作方法的方式。這有助於確保您的視圖僅顯示來自正確的主人的詳細信息。

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 */ 
} 

如果您呈現在其他頁面順序的細節,你會希望把你的訂單詳情中的局部視圖,所以你不重複你的任何標記。如果它只是在這裏呈現,那麼在這個視圖中沒有理由不能爲你添加標記。

3

你可能會(對用戶的可用性)要使用AJAX並從一個下拉列表中的「其他項目」 AJAX響應(可能爲JSON,或部分HTML頁面,如果你真的想要避免javascript)

如果你真的不想使用AJAX,你可以拉所有的項目,所有的「其他項目」和最初將它們存儲在「隱藏」字段中,並執行兩個選擇框。

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

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

我就老老實實用AJAX選項去除非雖然人們會經常用到每個下拉菜單中,或者如果選項的量是非常有限的。

阿賈克斯:http://www.plus2net.com/php_tutorial/ajax_drop_down_list.php

,只是想指出的是,它並不需要是用來選擇/填充下拉框,你只需要改變周圍的代碼來填充一個div或任何你想要的元素:)

+0

對不起,但你的回答並沒有爲我清理的東西..用戶 - 可用性現在不是一個問題,它是如何做到這一點,我需要的基本結構.. – Abbas

+0

也許你可以發佈你有什麼馬上?你看過這些例子,看看源代碼,看看他們在做什麼嗎? – John

+0

@Abbas你會爲此使用javascript。您有2個選項:在初始頁面加載時拉下所有「其他選項」,或者根據需要使用AJAX動態拉下它們。每次有人選擇第一個選項時,您都不希望加載不同的頁面,因爲這會更困難,同時用戶界面更不友好。 – John

1

我建議是這樣的:

  1. 你有一個動作的控制器。該行動有兩個 參數,一個與你的GUID和一個可選的一些其它ID
  2. 你有你「MAINVIEW」,它列出了項目
  3. 在您的控制器,只有一個 參數添加一個其他動作,此時,一個id
  4. 添加另一種觀點認爲,但這個時候,一個局部視圖,列出你的 其他項目

操作1把一個清單,項目在視圖模型,以及一個可選的ID來渲染其他一些項目。

行動3把一個列表,在視圖模型的一些其他項目

操作1渲染視圖和行動3渲染視圖4.查看2渲染,如果視圖模型是這麼說的,行動3.

基本上中,當沒有特定項被選中,那麼執行鏈將是這樣的: 1 => 2 =>完成

但是,當一個項目被選擇的鏈將是這樣的: 1 => 2 => 3 => 4

(當然,這只是一種做事方式。)