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