Новый вид или частичный вид - PullRequest
4 голосов
/ 10 ноября 2011

Это ситуация:

У меня есть приложение ASP.NET MVC 4.Когда я запускаю приложение, я перехожу на страницу, и индексное действие на контроллере принимает Guid в качестве id-параметра.С этим идентификатором я получаю список элементов из базы данных и помещаю его в ViewModel.Эта ViewModel передается в View, который перечисляет все элементы как ActionLink (может быть изменен при необходимости).Когда я щелкаю один из элементов, я хочу получить список других элементов на основе идентификатора выбранной ссылки и показывать этот новый список рядом с первым списком.

Но это мой вопрос (и где я застрял на 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);
}

Ответы [ 3 ]

3 голосов
/ 10 ноября 2011

Скорее всего (для удобства пользователя) вы захотите использовать 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, если только люди не будут часто использовать каждое из раскрывающихся списков или если количество вариантов очень ограничено.

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

И просто хочу отметить, что для выбора / заполнения не нужны выпадающие списки, вам просто нужно изменить код, чтобы заполнить div или любой другой элемент, который вы хотите:)

2 голосов
/ 10 ноября 2011

Есть несколько способов, с помощью которых вы можете создать страницу с основными / подробными данными, но на самом деле нет лучшего способа сделать это. 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 Guids, загрязняющих ваш URL, и этот пример не проверяет, действительно ли orderId принадлежит идентификатору (user?) - независимо от того, что представляет первый 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 */
}

Если вы визуализируете детали заказа на других страницах, вы захотите поместить детали вашего заказа в частичное представление, чтобы не дублировать какую-либо разметку. Если он отображается только здесь, то на самом деле нет никаких причин, по которым вы не могли бы иметь свою разметку прямо в этом представлении.

1 голос
/ 10 ноября 2011

Я бы предложил что-то вроде этого:

  1. У вас есть контроллер с действием.Действие принимает два параметра, один с вашим guid, а другой необязательный с другим идентификатором
  2. У вас есть «mainview», в котором перечислены ваши элементы
  3. В вашем контроллере добавьте еще одно действие, на этот разтолько с одним параметром, id
  4. Добавить другое представление, но на этот раз частичное представление, которое перечисляет другие ваши элементы

Действие 1 помещает список с элементами в модель представления,и необязательный идентификатор для визуализации некоторых других элементов.

Действие 3 помещает список с некоторыми другими элементами в viewmodel

Действие 1 отображает представление 2, а действие 3 отображает представление 4. Вид 2 отображает,если модель представления говорит об этом, действие 3.

В принципе, когда не выбран конкретный элемент, цепочка выполнения будет выглядеть следующим образом: 1 => 2 => Готово

Но когда выбран элементцепочка будет выглядеть следующим образом: 1 => 2 => 3 => 4

(Конечно, это всего лишь один из способов делать вещи ..)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...