Как отделить реляционные данные MVC - PullRequest
4 голосов
/ 16 мая 2011

Рассмотрим этот сценарий:

Я хочу создать приложение MVC для базы данных Northwind.Я хочу иметь представление, в котором перечислены некоторые заказы, и я хочу создать ссылки для CustomerID и EmployeeID и ссылку на подробности для [OrderDetails], чтобы при щелчке пользователем любой из этих ссылок связанные данные отображались на одной странице.

Моя проблема заключается в том, как разделить эти данные, которые связаны с представлениями и контроллерами, которые показывают связанные данные на странице, и контроллерами, ответственными за отдельные части информации.

Кроме того, как настроить маршрутизацию дляэтот образец?

<table width="500px">
    <tr>
        <th></th>
        <th>
            OrderID
        </th>
        <th>
            CustomerID
        </th>
        <th>
            EmployeeID
        </th>
        <th>
            OrderDate
        </th>
        <th>
            RequiredDate
        </th>
        <th>
            ShippedDate
        </th>
        <th>
            ShipVia
        </th>            
        <th>
            OrderDetails
        </th>   
    </tr>

<% foreach (var item in Model) { %>

    <tr>
        <td>
            <%: Html.ActionLink("Edit", "Edit", new { id=item.OrderID }) %> |
            <%: Html.ActionLink("Details", "Details", new { id=item.OrderID })%> |
            <%: Html.ActionLink("Delete", "Delete", new { id=item.OrderID })%>
        </td>
        <td>
            <%: item.OrderID %>
        </td>
        <td>
            <%: item.CustomerID %>
        </td>
        <td>
            <%: item.EmployeeID %>
        </td>
        <td>
            <%: String.Format("{0:g}", item.OrderDate) %>
        </td>
        <td>
            <%: String.Format("{0:g}", item.RequiredDate) %>
        </td>
        <td>
            <%: String.Format("{0:g}", item.ShippedDate) %>
        </td>
        <td>
            <%: item.ShipVia %>
        </td>            
        <td>
            <%: Html.ActionLink("OrderDetails", "GetOrderDetails", new { id = item.OrderID })%>
        </td>
    </tr>

<% } %>

</table>

<p>
    <%: Html.ActionLink("Create New", "Create") %>
</p>

<div>
    <p>
        <% Html.RenderPartial("GetOrderDetails"); %>
    </p>
    <%--<uc1:GetOrderDetails ID="GetOrderDetails1" runat="server" />--%>
</div>

и частичное представление деталей заказа:

<table>
    <tr>
        <th></th>
        <th>
            OrderID
        </th>
        <th>
            ProductID
        </th>
        <th>
            UnitPrice
        </th>
        <th>
            Quantity
        </th>
        <th>
            Discount
        </th>
    </tr>

<% foreach (var item in Model) { %>

    <tr>
        <td>
            <%: Html.ActionLink("Edit", "Edit", new { id=item.OrderID }) %> |
            <%: Html.ActionLink("Details", "Details", new { id=item.OrderID })%> |
            <%: Html.ActionLink("Delete", "Delete", new { id=item.OrderID })%>
        </td>
        <td>
            <%: item.OrderID %>
        </td>
        <td>
            <%: item.ProductID %>
        </td>
        <td>
            <%: String.Format("{0:F}", item.UnitPrice) %>
        </td>
        <td>
            <%: item.Quantity %>
        </td>
        <td>
            <%: item.Discount %>
        </td>
    </tr>

<% } %>

</table>

<p>
    <%: Html.ActionLink("Create New", "Create") %>
</p>

global.asax:

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");



        routes.MapRoute(
            "Default2", // Route name
            "{controller}/{action}/{OrderId}/{CustomerID}", // URL with parameters
            new { controller = "NorthwindOrders", action = "Index", OrderId = UrlParameter.Optional, CustomerID = UrlParameter.Optional } // Parameter defaults
        );

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
    }

Учитывая данную структуру;как я могу отобразить детали заказа в списке заказов при нажатии любой из ссылок OrderDetails?

И почему URL-адрес отображается следующим образом, когда я нажимаю ссылки OrderDetails:

http://localhost:49444/NorthwindOrders/GetOrderDetails?id=10250

Я хочу, чтобы URL-адрес отображался следующим образом:

http://localhost:49444/NorthwindOrders/GetOrderDetails/10250

Ответы [ 2 ]

2 голосов
/ 18 мая 2011

Для вашего вопроса о маршрутизации:

, если вы настроите маршрут следующим образом:

    routes.MapRoute(
        "orderdetails", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "NorthwindOrders", action = "GetOrderDetails", id = UrlParameter.Optional, CustomerID = UrlParameter.Optional } // Parameter defaults
    );

Он создаст URL в соответствии с вашими предпочтениями.

(В качестве альтернативы вы можете переименовать параметр в вашем действии GetOrderDetails в string OrderId, и он найдет маршрут, который форматирует URL-адрес так, как вы этого хотите.)

Что касается вашего основного вопроса:

Как «динамически» загружать контент на странице на основе кликов по ссылкам ?

Существует два способа решения этой проблемы:

  • Записьback pages.
  • AJAX / Динамическая загрузка данных и элементов в HTML на вашей странице.

В сценарии обратной передачи:

В этом сценарии вашавсе ссылки будут переходить к действиям, которые создают модель, которая включает в себя список заказов с вашей главной страницы, и для получения подробной информации о конкретном заказе, по которому вы щелкнули, вы должны заполнить свою модель спецификой для этого заказа.Тогда ваш возврат ActionResult будет таким же (или, по крайней мере, выглядит так же), и ваше представление будет использовать помощник PartialView Html для визуализации деталей.

OrderViewModel:

public class OrderViewModel
{
  public IList<Order> Orders {get;set;}
  public OrderDetail Details {get;set;}
}

OrderView.aspx:

<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage<OrderViewModel>" %>
<%:Html.DisplayFor(m=>m.Orders)%> <%-- Displays the Table above listing orders --%>
<%:Html.DisplayFor(m=>m.Details)%> <%-- Displays your custom view of the details --%>

OrderController:

...
public ActionResult List()
{
  var model = new OrderViewModel { Orders = GetAllOrders(), Details = null };
  return View("OrderView", model);
}

public ActionResult GetOrderDetails(string OrderId)
{
  var model = new OrderViewModel { Orders = GetAllOrders(), Details = GetOrder(OrderId) };
  return View("OrderView", model);
}
...

В сценарии Ajax:

Сценарий Ajax по сути такой же, за исключением того, что вы скрываете серверотключить вызов ajax, а затем перезагрузить страницу или просто div с содержимым, которое вы хотите получить из html (или JSON) в возвращаемых данных вызова ajax.

Преимущество подхода Ajax заключается в том, чточтобы вы могли указать другое действие на другом контроллере для различных частей страницы, которую вы хотите обновить.

2 голосов
/ 17 мая 2011

Нима,
Вы можете сделать это через частичное представление или действие рендеринга, а также json для отображения данных
основной пример приведен здесь в качестве примера: http://www.asp.net/mvc/tutorials/iteration-7-add-ajax-functionality-cs

или очень популярным вариантом является действие отображения для задачи в jquery.dialog ()

зависит от вас, какой путь вы хотите продолжить фо


редакция:

Мой плохой. С логической точки зрения это так:
Это зависит только от вас, какой путь вы хотите пойти. (С моей точки зрения)

Преимущества разделения логики:

  1. простой для понимания, поскольку контроллер связан только с действиями, например, для: заказов
  2. Может использоваться в других местах, если вам нужно
  3. Легко тестировать только мелкие предметы, например, один тестовый стенд / прибор к контроллеру только для заказов
  4. Полезно для более сложных проектов

С другой стороны

  1. Храните все в одном контроллере и разбивайте логику по областям
  2. Все вместе, легко увидеть другие методы и то, что они делают

Надеюсь, это то, что вы искали
фо

...