2014-02-18 5 views
1

Я пытаюсь получить элементы, хранящиеся в переменной сеанса, в ретранслятор для просмотра пользователями. Однако я не совсем уверен, как это сделать (я новичок в переменных сеанса). В основном, когда пользователи вводят в количествах для предметов, находящихся на одной странице, нажмите «отправить», они переходят на страницу «сводка заказов», в которой будет отображаться то, что они планируют приобрести. Я успешно настроил переменную сеанса, чтобы содержать количество и количество каждого продукта, который пользователь выбирает, но я не знаю, как получить информацию.элементы отображения внутри переменной сеанса внутри репитера?

Я сохранил информацию в переменной сеанса как [sku], [quantity], [sku], [quantity], [sku], [quantity] и так далее. Я полагаю, что я должен сделать раскол или что-то на основе запятых и точек с запятой, но я не уверен, как это сделать с переменной сеанса.

Код листинга странице, которая содержит информацию, которая будет храниться в переменной сеанса:

public partial class GojoptproductlistSublayout : System.Web.UI.UserControl 
{ 
    private void Page_Load(object sender, EventArgs e) 
    { 
     if(!Page.IsPostBack) 
     { 
      Item CurrentItem = Sitecore.Context.Item; 

      Item HomeItem = ScHelper.FindAncestor(CurrentItem, "gojoMarket"); 

      if (HomeItem != null) 
      { 
       Item ProductGroup = HomeItem.Axes.SelectSingleItem(@"child::*[@@templatename='gojoMarketOfficeBuildigProductMap']/*[@@templatename='gojoProductList']"); 

       if (ProductGroup != null) 
       { 
        Item[] LocationList = ProductGroup.Axes.SelectItems(@"child::*[@@templatename='gojoProductLocation' and @Active = '1']"); 
        if (LocationList != null) 
        { 
         DataSet ds = new DataSet(); 
         DataTable locations = ds.Tables.Add("locations"); 

         locations.Columns.Add("LocationName", Type.GetType("System.String")); 
         locations.Columns.Add("LocationID", Type.GetType("System.String")); 

         foreach (Item LocationItem in LocationList) 
         { 
          DataRow dr = locations.NewRow(); 
          dr["LocationName"] = LocationItem.Fields["Header"].Value; 
          dr["LocationID"] = LocationItem.ID.ToString(); 
          locations.Rows.Add(dr); 
         } 

         locationRepeater.DataSource = ds; 
         locationRepeater.DataMember = "locations"; 
         locationRepeater.DataBind(); 
        } 
       } 
      } 
     } 
    } 

    protected void SetInner(object sender, RepeaterItemEventArgs e) 
    { 
     if ((e.Item.ItemType != ListItemType.Footer) & (e.Item.ItemType != ListItemType.Header)) 
     { 
      Label refID = (Label)e.Item.FindControl("refID"); 
      Label test = (Label)e.Item.FindControl("test"); 
      Repeater areaRepeater = (Repeater)e.Item.FindControl("areaRepeater"); 

      Database db = Sitecore.Context.Database; 
      Item LocationAreaItem = db.Items[refID.Text]; 

      if (LocationAreaItem != null) 
      { 
       Item[] AreaList = LocationAreaItem.Axes.SelectItems(@"child::*[@@templatename='gojoProductLocationArea' and @Active = '1']"); 

       if (AreaList != null) 
       { 
        DataSet dset = new DataSet(); 
        DataTable areas = dset.Tables.Add("areas"); 

        areas.Columns.Add("AreaName", Type.GetType("System.String")); 
        areas.Columns.Add("Sku", Type.GetType("System.String")); 
        areas.Columns.Add("ProductName", Type.GetType("System.String")); 
        areas.Columns.Add("masterSku", Type.GetType("System.String")); 
        areas.Columns.Add("masterName", Type.GetType("System.String")); 
        areas.Columns.Add("Size", Type.GetType("System.String")); 
        areas.Columns.Add("SkuID", Type.GetType("System.String")); 
        areas.Columns.Add("AreaID",Type.GetType("System.String")); 
        areas.Columns.Add("productID", Type.GetType("System.String")); 

        foreach (Item AreaItem in AreaList) 
        { 
         DataRow drow = areas.NewRow(); 

         drow["AreaName"] = AreaItem.Fields["Header"].Value; 
         drow["AreaID"] = AreaItem.ID.ToString(); 

         areas.Rows.Add(drow); 

         Item[] SkuList = AreaItem.Axes.SelectItems(@"child::*[(@@templatename='gojoPTRefill' or @@templatename = 'gojoPTAccessories' or @@templatename = 'gojoPTDispenser' or @@templatename = 'gojoPTSelfDispensed') and @Active = '1']"); 

         foreach (Item ChildItem in SkuList) 
         { 
          Item MarketProduct = db.Items[ChildItem.Fields["Reference SKU"].Value]; 
          drow["productID"] = ChildItem.ID.ToString(); 

          if (MarketProduct != null) 
          { 
           Item MasterProduct = db.Items[MarketProduct.Fields["Master Product"].Value]; 
           if (MasterProduct != null) 
           { 
            DataRow newRow = areas.NewRow(); 

            if(MasterProduct.TemplateName == "gojoSKUSelfDispensed" || MasterProduct.TemplateName == "gojoSKURefill") 
            { 
             newRow["Size"] = MasterProduct.Fields["Size"].Value; 
            } 
            else 
            { 
             newRow["Size"] = "-"; 
            } 

            newRow["Sku"] = MasterProduct.Fields["SKU"].Value; 
            newRow["productID"] = MasterProduct.ID.ToString(); 

            Item MasterProductName = db.Items[MasterProduct.Fields["Complete Product Name"].Value]; 

            if (MasterProductName != null) 
            { 
             newRow["ProductName"] = MasterProductName.Fields["Complete Name"].Value; 

            } 
            areas.Rows.Add(newRow); 
           } 
          } 
         } 
        } 
        areaRepeater.DataSource = dset; 
        areaRepeater.DataMember = "areas"; 
        areaRepeater.DataBind(); 
       } 

      } 
     } 
    } 

    protected bool checkQtys(ref int ItemCnt, ref ArrayList LinesToOrder) 
    { 
     Repeater locationRepeater = (Repeater)FindControl("locationRepeater"); 

     bool validQtys = true; 
     string productID = ""; 
     int qty; 
     qtyErrorMsg.Text = ""; 
     qtyErrorMsgTop.Text = ""; 
     foreach (RepeaterItem repItem in locationRepeater.Items) 
     { 
      if (repItem != null) 
      { 
       Repeater areaRepeater = (Repeater)repItem.FindControl("areaRepeater"); 
       if (areaRepeater != null) 
       { 
        foreach (RepeaterItem skuItm in areaRepeater.Items) 
        { 

         if (skuItm != null) 
         { 
          Label SkuID = (Label)skuItm.FindControl("SkuID"); 
          Label qtyID = (Label)skuItm.FindControl("qtyID"); 

          PlaceHolder inner = (PlaceHolder)skuItm.FindControl("ProductTable"); 

           if (inner != null) 
           { 
            foreach (Control ct in inner.Controls) 
            { 
             if (ct is TextBox) 
             { 
              TextBox lineQty = (TextBox)ct; 
              Label prodID = (Label)inner.FindControl("productID"); 

              if (lineQty.Text != "") 
              { 
               try 
               { 
                int.Parse(lineQty.Text); 
                productID = prodID.Text; 
                qty = int.Parse(lineQty.Text); 

                if (qty > 0) 
                { 
                 noItemMsg.Visible = false; 
                 noItemMsgTop.Visible = false; 
                 ItemCnt++; //only count items with valid qty values 
                 LinesToOrder.Add(new LineItem(productID, qty)); 
                } 
                else 
                {//Qty is 0 or less error 
                 validQtys = false; 
                 qtyErrorMsg.Text = "Quantity must be a number<br />"; 
                 qtyErrorMsgTop.Text = "Quantity must be a number<br />"; 
                } 

               } 
               catch 
               {//NaN - display error msg 
                validQtys = false; 
                qtyErrorMsg.Text = "Quantity must be a number<br />"; 
                qtyErrorMsgTop.Text = "Quantity must be a number<br />"; 
               } 
              } 

             } 

            } 

           } 
         } 

        } 
       } 

      } 
     } 
     return validQtys; 
    } 

    class LineItem 
    {//This class will store the product information 
     public string SKUID; 
     public int Qty; 

     public LineItem(string InSKUID, int InQty) 
     { 
      this.SKUID = InSKUID; 
      this.Qty = InQty; 
     } 
    } 

    protected void orderSubmit(object sender, EventArgs e) 
    { 
     int ItemCnt = 0; 
     bool validQtys = true; 
     ArrayList LinesToOrder = new ArrayList(); 
     Label lb = FindControl("order") as Label; 

     if (checkQtys(ref ItemCnt,ref LinesToOrder)) 
     { 
      if (ItemCnt == 0) 
      {//make sure at least one item with proper qty amount is entered before submitting the order 
       validQtys = false; 
       noItemMsg.Visible = true; 
       noItemMsg.Text = "You must order at least one item<br />"; 
       noItemMsgTop.Visible = true; 
       noItemMsgTop.Text = "You must order at least one item<br />"; 
      } 
      if (validQtys) 
      {//save the information to a session variable and send users to order review page  
       try 
       { 
        foreach (LineItem WorkLine in LinesToOrder) 
        { 
         lb.Text += WorkLine.SKUID + ", " + WorkLine.Qty + ";"; 
        } 

        Session["orderComplete"] = lb.Text; 
       } 

       catch (Exception x) 
       { 
        Response.Write(x.Message.ToString()); 
       } 
       Response.Redirect("/united-states/market/office-buildings/obproductmap/OrderReview"); 

      } 
     } 
    } 
} 

Вот дизайнер код с ретранслятором, который предназначен для хранения резюме заказа:

<asp:Repeater ID="orderRepeater" runat="server" > 
    <headertemplate> 
     <tr> 
      <th>SKU</th> 
      <th>Quantity</th> 
     </tr> 
    </headertemplate> 
    <itemtemplate> 
     <tr> 
      <td><%#Eval("sku") %></td> 
      <td><%#Eval("qty") %></td> 
     </tr> 
    </itemtemplate> 
</asp:Repeater> 

А вот код позади:

private void Page_Load(object sender, EventArgs e) 
{ 
    Item CurrentItem = Sitecore.Context.Item; 
    Item HomeItem = ScHelper.FindAncestor(CurrentItem, "gojoMarket"); 

    if (Session["orderComplete"] != "") 
    { 
     if (HomeItem != null) 
     { 
      Item ProductGroup = HomeItem.Axes.SelectSingleItem(@"child::*[@@templatename='gojoMarketOfficeBuildigProductMap']/*[@@templatename='gojoOrderReview']"); 

      if (ProductGroup != null) 
      { 
       //this is where I am confused on how to proceed 


      } 

     } 
    } 
} 

Все работает, и я выполнил тест Response.Write в переменной сеанса, чтобы убедиться, что у него есть правильная информация, и он это сделал.

Заранее благодарен!

ответ

2

Прежде чем я попытаюсь ответить на ваш вопрос, давайте взглянем на некоторые основы. Сессия может содержать объект, а не только строковый объект. Я хотел бы изменить:

if (Session["orderComplete"] != "") 

в

if (Session["orderComplete"] != null && Session["orderComplete"] != "") 

, если вы этого не сделаете, и Session["orderComplete"] равно нулю, Session["orderComplete"] != "" выдаст ошибку object not set to an instance of an object

А теперь к вашему вопросу. Установка переменной сеанса на [sku],[quantity];[sku],[quantity];[sku],[quantity], это не очень хорошая идея. Во-первых, это не объектно-ориентированный, а 2, не связанный с каким-либо ретранслятором или источником данных. Вы должны создать объект и связать список этих объектов вашего контроля:

псевдокода:

class Program 
{ 
static void Main(string[] args) 
{ 
    List<Order> orders = new List<Order>(); 
    orders.Add(new Order { Sku = "ABC", Qty = 10}); 

} 
} 

public class Order { 

public String Sku { get; set; } 
public int Qty { get; set; } 

} 

Затем вы можете связать orders с ретранслятором. Например:

if (Session["orderComplete"] != null && Session["orderComplete"] != ""){ 
    List<Order> orders = Session["orderComplete"] as List<Order>; 
    myRepeater.DataSource = orders; 
    myRepeater.DataBind(); 
} 
+0

Мне нравится эта идея. Хотя, первоначально, я храню информацию внутри ArrayList и сортирую ее, чтобы заполнить переменную сеанса. Я обновил свой пост, чтобы показать код для страницы с листингом продукта .... –

+2

'if (Session [" orderComplete "]! = Null && Session [" orderComplete "]! =" ")' Можно было бы обрезать до ' if (! string.IsNullOrWhiteSpace (Session ["orderComplete"])) ' –

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