MVC, просмотр отображения данных - PullRequest
1 голос
/ 04 февраля 2011

Эй, я новичок в asp, и я хотел бы попросить вас о помощи.Я создал магазин с помощью учебника MvcMusicStore.Теперь я хочу добавить представление для управления заказами, которое будет отображать только OrderID (в индексном представлении), а затем дополнительную информацию в подробном представлении.Информация будет поступать из таблицы, которая выглядит следующим образом:

Когда я перечисляю OrderID, он умножается, потому что каждый продукт создает новую запись с тем же OrderID в таблице.Есть ли способ отобразить каждый Id только один раз?

Затем я попытался отобразить дополнительную информацию в Detaild View, но мне снова не удалось.Я использовал этот код в Controller:

        public ActionResult Details(int id)
    {
        var orderdetail = storeDB.OrderDetails.Single(a => a.Order.OrderId == id);
        return View(orderdetail);
    }

, но, очевидно, он не будет работать, потому что может отображаться только один элемент.Я также пытался использовать цикл foreach в Details.aspx, но получал ошибку, связанную с IEnumerables.Любой совет приветствуется, извините за вопрос новичка и плохой английский.Спасибо.

Редактировать: вот код контроллера для представления индекса (продукт в моей таблице равен альбому в учебнике):

        public ActionResult Index()
    {
        var manageorders = storeDB.OrderDetails
        .Include("Product").Include("Order")
        .ToList();
        return View(manageorders);
    }

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

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/MasterPage.Master" Inherits="System.Web.Mvc.ViewPage<ss.Models.OrderDetail>" %>

Индекс

<div id="style3">manage orders</div>
<div id="style1">
<table>
    <tr>
        <th></th>
        <th>
        user
        </th>
        <th>
        data
        </th>
        <th>
        product
        </th>
        <th>
        quantity
        </th>

    </tr>

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

    <tr>
        <td>
            <%: Html.ActionLink("Edit", "Edit", new { id=item.Order.OrderId }) %> |
            <%: Html.ActionLink("Details", "Delete", new { id=item.Order.OrderId })%>
        </td>
        <td>
            <%: item.Order.Username %>
        </td>
                    <td>
            <%: item.Order.OrderDate %>
        </td>
        <td>
            <%: item.Quantity %>
        </td>
                    <td>
            <%: item.Quantity %>
        </td>
    </tr>

<% } %>

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

И ошибка, которую я получаю:

Ошибка компилятораСообщение: CS1579: оператор foreach не может работать с переменными типа «ss.Models.OrderDetail», поскольку «ss.Models.OrderDetail» не содержит открытого определения для «GetEnumerator»

1 Ответ

0 голосов
/ 04 февраля 2011

Single() сгенерирует исключение, если в последовательности более одного элемента, поэтому ошибка здесь в том, что каждый Order может иметь много OrderDetails (это ваша ошибка IEnumerable-ish).Если вы хотите выбрать первое совпадение, когда их может быть много, используйте метод First (), который не сгенерирует, если их больше одного.

Это зависит от того, с чем работает ваш контроллер - Ordersили OrderDetails.Это будет разница между Orders/Details/1 и OrderDetails/Details/1, где первый будет фокусироваться на всем заказе и всех его деталях, а второй будет смотреть на одну конкретную строку.

Если вы хотитечтобы работать с заказом - который, похоже, вам нужен - тогда вам понадобится какая-то ссылка из Order на его коллекцию OrderDetails.Если вы используете что-то вроде Entity Framework, как в учебнике MusicStore, вы получите эту коллекцию как часть вашей модели сущностей.Вы бы передали Order в представление, а затем могли бы получить доступ к коллекции OrderDetails в цикле a для каждого или подобного цикла, например:

public ActionResult details(int id)
{
   Order viewModel = storeDb.Orders.Single(o => o.Id = id);
   return View(viewModel);
}

Это не будет выдано, если Id является уникальным для каждого заказа, посколькуодин матч (не много).В этом случае ваше представление может выглядеть примерно так:

<ul>
<% foreach (OrderDetails od in Model.OrderDetails) { %>
   <li><%: od.UnitPrice %> (Or whatever information you wanted to show) </li>
<% } %>
</ul>

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

Редактировать - добавить еще ...

1.Печатка вашей страницы вызывает у вас некоторые проблемы, убедитесь, что вы четко понимаете свои собственныевозражайте точно, какая у вас модель.Если вы передаете список - как в действии Index - вам нужна страница, которая наследует ViewPage> (вы можете увидеть это в объявлении <% @ Page%> вверху страницы).Если вы собираетесь писать код типа «для каждого ... в модели», это будет означать, что ваша модель должна содержать более чем одну вещь.Отсюда ваше сообщение об ошибке «GetEnumerator».

Ваше опубликованное представление наследует ViewPage, т. Е. Модель представляет собой отдельный объект, а не набор объектов, и, следовательно, "для каждого ... в модели" не имеет смысла.Тип вашего Представления должен совпадать с типом, передаваемым вашим контроллером.Ваш метод Index передает List, а List является примером IEnumerable.Однако ваши данные передают один YourModelClass.

2. Сообщение об ошибке «Сообщение об ошибке компилятора: CS1061:« ss.Models.OrderDetail »не содержит определения для« OrderDetails »» - проверьте вашу модель, если естьявляются связями (внешними ключами и т. д.) между вашими таблицами, они должны быть объединены на диаграмме модели, и у вас обычно также есть свойства навигации.Тот факт, что вы получаете это сообщение, означает, что чего-то в этом нет.

3. Я бы посоветовал проверить некоторые видео, так как пояснения довольно удобны.Попробуйте некоторые видео на http://www.asp.net/mvc/fundamentals.I Серия Джо Стэгнера «Для всех нас» очень хороша, и в качестве отправной точки может помочь «Создание приложения БД для фильмов» Стивена Уолтера, поскольку она показывает подобные вещи.

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