【问题标题】:How to populate part with session data in Orchard CMS如何在 Orchard CMS 中使用会话数据填充部件
【发布时间】:2012-04-03 06:00:50
【问题描述】:

我正在尝试从驱动程序中的 HTTP 会话返回 ContentPart。这是我的 Driver 和 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));

它不显示任何内容。我得到一个空的文章标签:

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-3 orchardcms


    【解决方案1】:

    空标签通常意味着后台有一些异常。 请查看 /App_Data/Logs。

    我明白你想要达到的目标,但你应该以不同的方式完成。

    最佳实践是利用内容处理程序的OnLoading 事件来使用来自不同来源的数据填充部件属性,例如。 session。 将整个部分存储在 session 中肯定会在某些时候给你带来麻烦,尤其是当部分绑定到数据库记录时。

    处理程序应执行所有准备操作。

    驱动程序应该只将显示/编辑器相关的逻辑保存在即用型部件上(例如选择正确的形状、准备视图模型)。因此,驱动程序在大多数情况下应该保持非常简单。

    所以在你的情况下,步骤是:

    1. 创建一个从 ContentHandler 派生的 CartHandler
    2. 在 1 中创建的处理程序中使用 OnLoading 事件使用来自会话的数据来补充属性

    例子:

    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"]; 
                // ........ 
            });
        }
    }
    

    每次加载包含它的内容项时,都会调用此事件,然后再显示它。因此,在驱动程序中,您将收到一个完全填充的部分。

    添加处理程序后,您的驱动程序 Display 方法看起来会简单得多:

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

    【讨论】:

    • Piotr 说的是对的,不要在会话中存储整个 ContentPart,最好只存储一个标识符
    • 谢谢。 orchardcms 中有没有显示这些东西的模块。我找不到有关 onloaded 事件的任何文档。
    • 以下是有关处理程序的一些信息:docs.orchardproject.net/Documentation/…。尽管需要一些更详细的信息,但本主题将使您更深入地了解一切是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多