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 Серия Джо Стэгнера «Для всех нас» очень хороша, и в качестве отправной точки может помочь «Создание приложения БД для фильмов» Стивена Уолтера, поскольку она показывает подобные вещи.