2013-02-18 1 views
0

У нас есть сложная структура корзины покупок. Сложность заключается в структуре ценообразования. Для расчета всех ценообразований требуется значительное количество отдельных объектов базы данных. Из-за сложности мы сохраняем только небольшой объем данных для корзины покупок каждого клиента, и когда нам нужна тележка, мы читаем все данные этих телеграмм, а также множество деталей ценообразования из базы данных - (РЕДАКТИРОВАТЬ) И ПРОВЕРЬТЕ РЕЗУЛЬТАТЫ В ОБЪЕКТ ОБЪЕКТА ПОКУПКИ, ПОЛНЫЙ С ИТОГАМИ. Это, к сожалению, относительно дорогое время.MVC - Как я могу поделиться моделью в макете и виде

Наш макет главного сайта (РЕДАКТИРОВАТЬ) ПОЛУЧАЕТ ОБЪЕКТ ПОКУПКИ КАРТОЧКИ и предоставляет ссылку на корзину покупок и показывает сумму, подлежащую оплате, если в корзине есть какие-либо предметы.

У нас есть страницы, которые могут содержать или не показывать другую информацию из корзины. Например, страница «О нас» не нуждается в тележке, но макет сайта все равно будет нуждаться в ней.

Я установил глобальный объект для корзины покупок. Я могу получить доступ к этому объекту из макета главного сайта. Я также могу поместить его в viewmodel для страницы.

Таким образом, иногда макет основного сайта создает экземпляр корзины покупок, а viewmodel создает корзину для покупок независимо.

(РЕДАКТИРОВАТЬ) ТАК САЙТ ПЛАТЕЖИ НУЖДАЕТСЯ ОБЪЕКТОМ ПОКУПКИ КОРПУСА ДЛЯ КАЖДОЙ СТРАНИЦЫ - И СТРАНИЦЫ МОГУТ ИЛИ НЕ МОГУТ БЫТЬ НЕОБХОДИМОСТИ ОБЪЕКТОМ ПОКУПКИ.

Проблема: вид может иметь или не иметь корзину покупок, которую он мог бы вставить в ViewBag, чтобы макет сайта мог использовать его. Как я могу создать экземпляр объекта корзины только один раз в жизненном цикле?

public class ShoppingCart 
{ 
    // Complex, data intensive calculations upon instantiation 
} 

public class myViewModel 
{ 
    public ShoppingCart cart {get; set;} 
} 

В макете мастер сайта:

@{ 
    ShoppingCart cart = new ShoppingCart(GlobalMemberID); 
} 

В странице, которая нуждается в Корзина:

@model myViewModel 
+0

Если нам нужна страница о нас, то вычислите его в контроллере. Вы уже знаете, что вам это нужно, поэтому сделайте это до того, как будет вызван вид. – jcolebrand

+0

jcolebrand - Спасибо за ваш ответ. Если эта страница нуждается в ней, я могу рассчитать в контроллере, а затем передать корзину покупок для просмотра, тогда представление может передать корзину покупок в макет. Но если страница НЕ нужна, то как макет получит копию корзины покупок? Кроме того, если это необходимо где-то еще, как я могу его переместить? Мой вопрос: есть ли способ создать экземпляр только для каждого запроса, а затем использовать его как «глобально»? – Cary

+0

Для того, что вы описываете, я бы увидел его как «положил его в базовый контроллер». – jcolebrand

ответ

1

Вы можете хранить экземпляр корзина в HttpContext.Items словарь, чтобы он доступен на протяжении всего жизненного цикла HTTP-запроса и дважды удаляйте базу данных для одних и тех же данных.

+0

Спасибо! Я просто попробовал, и это работает для меня. Я работал со Сессией, но способ, которым сеанс сохраняется во всех запросах, для меня проблематичен. – Cary