2011-09-13 3 views
0

안녕하세요, 지금 막 조금 붙어 있습니다. 포럼을 만들고 있는데, 코드에서 "threadID"를 얻는 것 같지 않습니다.이 기능이 필요합니다. 그런 다음 데이터베이스에 게시하십시오.리피터 내부의 레이블에서 ID 값을 가져옵니다.

"threadID"가 첫 번째 중계기에서 동적으로 생성되므로이 값을 얻기 위해 필요합니다.

"컴파일러 오류 메시지 : CS0103 : 현재 컨텍스트에 존재하지 않는 'threadID'이름"나는 브라우저에서이 오류를 얻고 순간

여기

코드입니다 :

<h1>viewThread.aspx</h1> 
    <!-- THREAD TEXT STARTS ---> 
    <asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1" EnableViewState="False"> 
     <ItemTemplate> 
      <h2><%# Eval ("threadTitle") %></h2> 
      <!--- THIS THREAD ID NEEDS TO BE GENERATED DYNAMICALLY SO WE CAN THEN GRAB IT TO USE IN THE REPLY ---> 
      <asp:Label ID="threadID" runat="server" Visible="false" Text='<%# Eval ("threadID") %>' /> 
      <%# Eval ("threadText") %> 
     </ItemTemplate> 
    </asp:Repeater> 
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
     ConnectionString="<%$ ConnectionStrings:VSTESTConnectionString %>" 
     SelectCommand="SELECT * FROM [threadCat&amp;Thread] WHERE ([threadID] = @threadID)"> 
     <SelectParameters> 
      <asp:QueryStringParameter DefaultValue="1" Name="threadID" QueryStringField="t" 
       Type="Int32" /> 
     </SelectParameters> 
    </asp:SqlDataSource> 
    <!-- THREAD TEXT ENDS ---> 

    <!-- USER GENERATED REPLYS ---> 
    <h2>Replys</h2> 

    <asp:Repeater ID="Repeater2" runat="server" DataSourceID="SqlDataSource2"> 
     <ItemTemplate> 
      <%#Eval ("postText") %> <br /> 
      Date Posted <%#Eval ("postCreated") %> 
     </ItemTemplate> 
    </asp:Repeater> 
    <asp:SqlDataSource ID="SqlDataSource2" runat="server" 
     ConnectionString="<%$ ConnectionStrings:VSTESTConnectionString %>" 
     SelectCommand="SELECT * FROM [posts] WHERE ([threadID] = @threadID)"> 
     <SelectParameters> 
      <asp:QueryStringParameter DefaultValue="1" Name="threadID" QueryStringField="t" 
       Type="Int32" /> 
     </SelectParameters> 
    </asp:SqlDataSource> 
    <!-- USER GENERATED REPLYS ENDS ---> 

    <!-- REPLY ---> 
    <h2>post a reply</h2> 
    Userid<asp:TextBox ID="userID" runat="server" /><br /> 
    <asp:TextBox ID="postTxt" TextMode="MultiLine" runat="server"></asp:TextBox><br /> 
    <asp:Button ID="reply" runat="server" Text="Reply" onclick="reply_Click" /> 
    <!-- REPLY ENDS ---> 
</asp:Content> 

<h1>viewThread.aspx.cs</h1> 



using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Data.SqlClient; 

public partial class viewThread : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected void reply_Click(object sender, EventArgs e) 
    { 
     /* threadID is not showing in intellisense */ 
     string thread = threadID.Text; 
     string user = userID.Text; 
     string reply = postTxt.Text; 
     string date = DateTime.Now.ToString(); 
     int locked = 0; 

     SqlConnection sqlCon = new SqlConnection("Server =.\\SQLEXPRESS; Database =VSTEST; Trusted_Connection =True;"); 
     SqlCommand sqlCom = new SqlCommand("INSERT INTO posts(threadID, postBy, postText, postCreated, postLocked) VALUES ('" + thread + "','" + user + "','" + reply + "','" + date + "','" + locked + "')", sqlCon); 
     try 
     { 
      sqlCon.Open(); 
      sqlCom.ExecuteNonQuery(); 
     } 
     catch (Exception ex) 
     { 
      Response.Write("Brokies.... " + ex.ToString()); 
     } 
     finally 
     { 
      sqlCon.Close(); 
      Response.Redirect("/forums/Default.aspx"); 
     } 
    } 
} 

이 viewstate가를 사용하여 문제를 해결 한 변화는 다음과 같습니다 :

public partial class viewThread : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (Request.QueryString["t"] != null && Request.QueryString["t"].ToString() != "") 
     { 
      ViewState["threadID"] = Request.QueryString["t"].ToString(); 
     } 
    } 

    protected void reply_Click(object sender, EventArgs e) 
    { 
     string user = userID.Text; 
     string reply = postTxt.Text; 
     string date = DateTime.Now.ToString(); 
     int locked = 0; 

     SqlConnection sqlCon = new SqlConnection("Server =.\\SQLEXPRESS; Database =VSTEST; Trusted_Connection =True;"); 
     SqlCommand sqlCom = new SqlCommand("INSERT INTO posts(threadID, postBy, postText, postCreated, postLocked) VALUES ('" + ViewState["threadID"].ToString() + "','" + user + "','" + reply + "','" + date + "','" + locked + "')", sqlCon); 
     try 
     { 
      sqlCon.Open(); 
      sqlCom.ExecuteNonQuery(); 
     } 
     catch (Exception ex) 
     { 
      Response.Write("Brokies.... " + ex.ToString()); 
     } 
     finally 
     { 
      sqlCon.Close(); 
      Response.Redirect("/forums/Default.aspx"); 
     } 
    } 

} 

답변

0

Visible="false"을 설정하는 대신 CSS로 가시성을 설정하십시오. 당신은 데이터 키를 정의 할 수 있습니다, 그래서 내가 대신의 ListView를 사용하는 것이 좋습니다 것, 솔직히

Label lbl = Repeater1.Items[0].FindControl("threadID") as Label; 
if (lbl != null) 
{ 
    int threadID = Int32.Parse(lbl.Text); 
} 

:

<asp:Label ID="threadID" runat="server" style="display:none;" Text='<%# Eval("threadID") %>' /> 

그리고이 코드를 사용하려고합니다. 이것은 그런 식으로 훨씬 쉽게 될 것입니다 :

<asp:ListView ID="ListView1" runat="server" DataKeyNames="threadID"> 
    <ItemTemplate> 
     <h2><%# Eval ("threadTitle") %></h2> 
     <%# Eval ("threadText") %> 
    </ItemTemplate>  
</asp:ListView> 

그리고 당신은 뒤에 코드에서이 같은 threadID에 액세스 할 수 있습니다

int itemIndex = 0; //index of your current item 
int threadID = (int)ListView1.DataKeys[itemIndex]["threadID"]; 
+0

헤이 바로 뒤에 코드에서, 필자는 여전히 같은 오류가 있음을 시도 – noscript

+0

수정 된 답변보기 –

+0

안녕하세요, 그걸로부터 행운을 얻고 싶지 않습니다, 컴파일러 오류 메시지 : CS0103 : '스레드'이름이 현재 컨텍스트에 존재하지 않습니다. 그것은 SQL 문을 가리키고 있으므로 값이 표시되지 않습니다. – noscript

관련 문제