2011-02-04 5 views
1

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

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

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

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

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

Edit: Вот код контроллера для Index View (продукт в моей таблице равно Альбом в учебнике):

 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>" %> 

Index

<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> 

И ошибка Я ПОЛУЧАТЬ:

Compiler Error Message: CS1579: foreach statement cannot operate on variables of type 'ss.Models.OrderDetail' because 'ss.Models.OrderDetail' does not contain a public definition for 'GetEnumerator'

+0

Можете ли вы опубликовать код с вашего вида (ASPX)? Это может помочь нам диагностировать ошибку IEnumerable, которую вы видите. – JMP

+0

У вас есть ссылка на этот учебник? – Spooks

+0

@Spooks - это будет ASP.Net MusicStore по адресу http://www.asp.net/mvc/tutorials/mvc-music-store-part-1 – RichardW1001

ответ

0

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

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

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

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

Edit - добавить больше ...

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

Ваше мнение, как указано, наследует ViewPage, то есть модель представляет собой единый объект, а не набор объектов, и поэтому «для каждого ... в модели» не имеет смысла. Тип вашего представления должен быть таким же, как тип, передаваемый вашим контроллером. Метод Index передает список, а List - пример IEnumerable. Однако ваши данные передаются только с одним MyModelClass.

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

3.Id предложили бы, возможно, стоит проверить некоторые из видео, так как объяснения весьма удобны. Попробуйте некоторые из видео на http://www.asp.net/mvc/fundamentals. Серия Jo's Stagner для «Остальных нас» очень хороша, и в качестве отправной точки «Создание приложения для видеороликов» Стивена Уолтера помогло бы, так как это проявилось в этом.

+0

Спасибо за ваш ответ. Мне нужно взять данные из 3-х таблиц в Details View: Order, OrderDetails и Product. Мне нужно отобразить DetailId в Index.aspx и данные из этих трех таблиц в Details.aspx. Я попытался использовать цикл, который вы представили, но VS подчеркнула OrderDetails в Model.OrderDetails, и я получил ошибку: Сообщение об ошибке компилятора: CS1061: 'ss.Models.OrderDetail' не содержит определения для 'OrderDetails' и никакого метода расширения 'OrderDetails' можно принять первый аргумент типа «ss.Models.OrderDetail» (вам не хватает директивы using или ссылки на сборку?) – darx

+0

Итак, в этом случае вам нужно предоставить дополнительную информацию о вашей модели. Я предполагал, что вы использовали Entity Framework, как в учебнике, что обычно означает, что у вас есть свойства коллекции, которые вы можете использовать. В вашем примере есть множество других вещей, поэтому я отправлю его как отредактировать на этот ответ. – RichardW1001

+0

Да, я использовал Entity Framework, и я действительно не изменил многое в проекте. Я бы сказал, что я только изменил имена трех таблиц и их столбцы в соответствии с моими потребностями. Таким образом, в основном нет альбома, кроме Продукта, ни Художника, ни Марка, и категории вместо Жанра. Возможно, я напишу, что я пытаюсь сделать, основываясь на учебнике. Это будет просмотр индекса, показывающий OrderId и отображение деталей, скажем, альбом, исполнитель, количество, цена, адрес и город. Я пытался помочь на официальном форуме, но, похоже, он мертв. Спасибо за ваше время! – darx

Смежные вопросы