2012-10-06 3 views
0

온라인 상점 웹 사이트를 만들고 싶습니다.키가있는 채워진 격자보기를 세션에서 가져 오는 방법

내 사이트에서 내 제품을 보여주는 데이터리스트를 만들었습니다. 사용자가 선택한 장바구니에 제품의 productID를 가져 오는 데 LinkButton을 배치했습니다.

<asp:LinkButton ID="LinkButton1" runat="server" Text="Add To Cart" CommandName="addtocart" CommandArgument='<%# Eval("id")%>' > 

이 때 사용자가하는 LinkButton이 이벤트가 발생하십시오

protected void theDataList_ItemCommand(object source, DataListCommandEventArgs e) 
{ 
//this add the selected product-id to the list<int> and put it in the 
// session["addtocart"] 
     if (e.CommandName == "addtocart") 
     {         
      int productid = Convert.ToInt32(e.CommandArgument); 
      Label6.Text = productid.ToString(); 


      List<int> productsincart = (List<int>)Session["addtocart"]; 
      if (productsincart == null) 
      { 
       productsincart = new List<int>(); 
      } 

      productsincart.Add(productid); 

      Session["addtocart"] = productsincart; 
} 

을 그 후 사용자가 텍스트가 "쇼 쇼핑 카트"입니다의 버튼을 클릭하면, 사용자는 shoppingCart가 표시됩니다. 이 페이지에서 aspx 페이지

Response.Redirect("shoppingcart.aspx"); 

난있는 gridview를하고 난 세션 [ "addToCart와"]에 바인딩 할; 페이지로드 gridview 해당 ID가 세션 [ "카트"] 에있는 선택한 제품을 표시하지만 작동하지 않고이 오류가 발생했습니다 : System.InvalidCastException : Object IConvertible을 구현해야합니다.

이 관련 코드입니다 : 나는 문제가 GridView3 및 세션 관련이 알고

  <asp:GridView ID="GridView3" runat="server" 
      DataSourceID="SqlDataSource1" > 

      <columns> 
      <asp:BoundField DataField="id" HeaderText="id" SortExpression="id" /> 
      <asp:BoundField DataField="name" HeaderText="post" SortExpression="post" /> 
      <asp:BoundField DataField="price" HeaderText="salary" 
       SortExpression="salary" /> 
      <asp:BoundField DataField="color" HeaderText="years" SortExpression="years" /> 

     </columns> 

    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
     ConnectionString="<%$ ConnectionStrings:employeeConnectionString4 %>" 
     SelectCommand="SELECT * FROM [products] WHERE ([productid] = @productid)"> 
     <SelectParameters> 
      <asp:SessionParameter DefaultValue="7" Name="cart" SessionField="cart" 
       Type="Int32" /> 
     </SelectParameters> 

[ "addToCart와"는, 나는 GridView3는 정수 목록 객체에서 값을 변환 할 수 없습니다 생각하는 세션 [ "addtocart"] 정수에 저장됩니다, 세션 개체에서 정수 목록으로 변환 오류가 나올 것 같아요하지만 어떤 몸이 도움이 될 경우이 문제를 해결하는 방법을 알고 있습니다. 너무 감사합니다.

세션의 개체 [ "cart"]는 사용자가 구입하도록 선택한 productsid 목록을 포함하는 정수 목록입니다. 이 오류는 다음과 같습니다.

Object는 IConvertible을 구현해야합니다. 설명 : 현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 발생했습니다. 오류 및 코드에서 시작된 위치에 대한 자세한 정보는 스택 추적을 검토하십시오.

예외 세부 정보 : System.InvalidCastException : Object IConvertible을 구현해야합니다.

소스 오류 :

처리되지 않은 예외가 현재 웹 요청을 실행하는 동안 생성되었습니다. 예외의 출처와 위치에 관한 정보는 아래의 예외 스택 추적을 사용하여 식별 할 수 있습니다.

스택 추적은 :

[InvalidCastException: Object must implement IConvertible.] 
System.Convert.ChangeType(Object value, TypeCode typeCode, IFormatProvider provider) +2880621 
System.Web.UI.WebControls.Parameter.GetValue(Object value, String defaultValue, TypeCode type, Boolean convertEmptyStringToNull, Boolean ignoreNullableTypeChanges) +141 
System.Web.UI.WebControls.Parameter.GetValue(Object value, Boolean ignoreNullableTypeChanges) +63 
System.Web.UI.WebControls.ParameterCollection.GetValues(HttpContext context, Control control) +301 
System.Web.UI.WebControls.SqlDataSourceView.InitializeParameters(DbCommand command, ParameterCollection parameters, IDictionary exclusionList) +264 
System.Web.UI.WebControls.SqlDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments) +472 
System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +19 
System.Web.UI.WebControls.DataBoundControl.PerformSelect() +142 
System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +73 
System.Web.UI.WebControls.GridView.DataBind() +4 
System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() +82 
System.Web.UI.WebControls.CompositeDataBoundControl.CreateChildControls() +72 
System.Web.UI.Control.EnsureChildControls() +87 
System.Web.UI.Control.PreRenderRecursiveInternal() +44 
System.Web.UI.Control.PreRenderRecursiveInternal() +171 
System.Web.UI.Control.PreRenderRecursiveInternal() +171 
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +842 
+0

다음 사항을 알려주십시오. 1) 장바구니 객체가 무엇인지, 2) 오류가 발생한 코드 (특정 행). 코드를 살펴보면 문제가 SqlDataSource에있는 것처럼 보입니다. 그리드보기가 아닙니다. –

+0

세션의 개체 [ "cart"]는 사용자가 구매하도록 선택한 productsid 목록을 포함하는 정수 목록입니다. –

답변

0

문제는 SQL을 매개 변수입니다. 당신이하려고하는 것처럼 유형 List<int>을 Int32로 캐스트 할 수 없습니다. List 객체는 iConvertible을 구현하지 않으므로 다른 접근 방식이 필요합니다.

업데이트 이와 마크 업 :

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:employeeConnectionString4 %>" /> 

내가 일반적으로 여기에 당신이하고있는대로의 SqlDataSource를 사용하지 않지만 당신이 원하는 쿼리에 대한 올바른 구문을 만들 수있는 방법입니다 내가 말했듯이

public void Page_Load(object sender, EventArgs e) 
{ 
    this.SqlDataSource1.SelectCommand = String.Format("SELECT * FROM [products] WHERE [productid] in ({0}))", GetInValues(Session["cart"] as List<int>)); 
} 
public string GetInValues(List<int> lst) 
{ 
    System.Text.StringBuilder sValues = new System.Text.StringBuilder(); 
    if (i == null) 
     sValues.Append(0); 
    else 
    { 
     foreach (int i in lst) 
     { 
      if (sValues.Length > 0) 
       sValues.Append(", "); 
      sValues.Append(i); 
     } 
    } 
    return sValues.ToString(); 
} 

은, 마크 업에서이 작업을 수행 할 수있는 방법이있을 수 있지만, 내가 잘 알고있어 뭔가 아니다 : 그런를 Page_Load에 다음과 같이 연결 문자열을 구축 할 수 있습니다.

또한 List를 상속하고 iCovertible을 구현하는 클래스를 만들 수도 있지만 SqlParameter로 작동하는 방법을 생각할 수는 없습니다. 게다가 iConvertible 인터페이스는 올바르게 기억한다면 15 개의 함수와 같기 때문에이 인스턴스를위한 많은 작업처럼 보입니다.

관련 문제