Как заполнить деталь данными сеанса в Orchard CMS - PullRequest
2 голосов
/ 18 марта 2012

Я пытаюсь вернуть ContentPart из сеанса HTTP в драйвере. Вот код для моего драйвера и ContentPart:

public class UnpersistedPartDriver : ContentPartDriver<UnpersistedPart>
{
    public Localizer T { get; set; }
    private readonly IHttpContextAccessor _httpContextAccessor;

    public UnpersistedPartDriver(IHttpContextAccessor httpContextAccessor) {
        T = NullLocalizer.Instance;
        _httpContextAccessor = httpContextAccessor;
    }

    /// <summary>
    /// This method is responsible for displaying your part in the frontend.
    /// </summary>
    /// <param name="part">Your part.</param>
    /// <param name="displayType"></param>
    /// <param name="shapeHelper"></param>
    /// <returns></returns>
    protected override DriverResult Display(UnpersistedPart part, string displayType, dynamic shapeHelper)
    {
        var session = _httpContextAccessor.Current().Session;
        var cart = session["Cart"] as UnpersistedPart;
        if (cart == null) {
            cart = new UnpersistedPart();
            session["Cart"] = cart;
        }

        return ContentShape("Parts_Jumpstart_Unpersisted",
            () => shapeHelper.Parts_Jumpstart_Unpersisted(ContentPart: part));
    }

    // There is nothing to edit and update, so we don't need Editor methods.
}
public class UnpersistedPart : ContentPart
{
    public UnpersistedPart()
    {
        this.Items = new List<Item>();
        this.Items.Add(new Item { Id = 1, Title = "Book 1", Price = "130.00", Quantity = "1" });
        this.Items.Add(new Item { Id = 2, Title = "Book 2", Price = "145.00", Quantity = "2" });
        this.Items.Add(new Item { Id = 3, Title = "Book 3", Price = "150.00", Quantity = "3" });
    }

    public IList<Item> Items;
    public string Total
    {
        get 
        {
            return Items.Sum(i => i.Total).ToString();
        }
    }
    public string SessionId;
}

[Serializable]
public class Item
{
    public int Id;
    public string Title;
    public string Price;
    public string Quantity;
    public decimal Total { get { return decimal.Parse(Price) * int.Parse(Quantity); } }
}

Когда я заменяю деталь на корзину:

return ContentShape("Parts_Jumpstart_Unpersisted",
            () => shapeHelper.Parts_Jumpstart_Unpersisted(ContentPart: part));

до:

return ContentShape("Parts_Jumpstart_Unpersisted",
            () => shapeHelper.Parts_Jumpstart_Unpersisted(ContentPart: cart));

ничего не отображается. Я получаю пустой тег статьи:

1 Ответ

5 голосов
/ 18 марта 2012

Пустой тег обычно означает, что на заднем плане было какое-то исключение. Пожалуйста, посмотрите в /App_Data/Logs.

Я вижу, чего ты хочешь достичь, но ты должен был сделать это по-другому.

Рекомендуется использовать событие OnLoading обработчика содержимого для заполнения свойств детали данными из разных источников, например. сеанс. Сохранение всей детали в сеансе наверняка в какой-то момент может привести к проблемам, особенно когда деталь привязана к записи базы данных.

Обработчики должны выполнять все подготовительные операции.

Драйверы должны содержать логику, связанную с отображением / редактором, только на готовой детали (например, выбор правильной формы, подготовка модели вида). Поэтому большую часть времени водители должны быть очень простыми.

Так что в вашем случае шаги будут:

  1. Создать класс CartHandler , производный от ContentHandler
  2. Используйте событие OnLoading в обработчике, созданном в 1. , чтобы гидрировать свойство / свойства данными сеанса.

Пример: * 1 034 *

public class CartHandler : ContentHandler
{
    public CartHandler(IHttpContextAccessor context)
    {
        this.OnLoaded<UnpersistedPart>(ctx, part =>
        {
            var session = context.GetCurrent().Session;
            // Here comes loading data from session

            part.MyProperty = session["Something"]; 
            // ........ 
        });
    }
}

Это событие будет вызываться каждый раз, когда загружается элемент содержимого, содержащий его, перед его отображением. Таким образом, в драйвере вы получите полностью заполненную часть.

После добавления обработчика метод отображения драйвера будет выглядеть намного проще:

protected override DriverResult Display(UnpersistedPart part, string displayType, dynamic shapeHelper)
{
    return ContentShape("Parts_Jumpstart_Unpersisted",
        () => shapeHelper.Parts_Jumpstart_Unpersisted(ContentPart: part));
}
...