Panel eller PlaceHolder?
Jag har för mig att det ska finnas en serverkontroll som kan "kapsla" in andra kontroller. På så vis kan man t ex sätta visible = true för flera kontroller samtidigt. Vad heter den här kontrollen?
6 svar · 421 visningar · startad av trexter
Jag har för mig att det ska finnas en serverkontroll som kan "kapsla" in andra kontroller. På så vis kan man t ex sätta visible = true för flera kontroller samtidigt. Vad heter den här kontrollen?
Panel eller PlaceHolder?
Det verkar fungera lite grand i alla fall, men när jag lägga in flera kontroller:
<asp:Panel id="PanelLogIn" visible="true" runat="server">
<table>
<tr>
<td>Email:</td>
<td><asp:TextBox id=UserName Width=200 Runat=server /></td>
<td><ASP:RequiredFieldValidator ControlToValidate="UserName" Display="Static" ErrorMessage="*" ID="RFVUser" runat=server /></td>
</tr>
<tr>
<td>Password:</td>
<td><asp:TextBox id=UserPass Width=200 Runat=server TextMode="Password" /></td>
<td><ASP:RequiredFieldValidator ControlToValidate="UserPass" Display="Static" ErrorMessage="*" ID="RFVUpass" runat=server /></td>
</tr>
<tr>
<td>Persistent Cookie:</td>
<td><ASP:CheckBox id=PersistCookie runat="server" /> </td>
<td></td>
</tr>
</table>
</asp:Panel>
får jag felet
Object reference not set to an instance of an object.
Jag antar (?) att detta beror på att code-behind-filen inte hittar kontrollerna, t ex:
SqlCommand myCommand = new SqlCommand("select * from Anvandare where AnvNamn = '" + UserName.Text + "' AND AnvPass = '" + UserPass.Text +"'", myConnection);
Du har nog glömt att deklarera kontrollerna i code-behind.
Dessutom. Använd alltid, alltid, alltid parametriserade frågor. Bättre prestanda och eliminering av sql-injection-risken blir resultatet.
I exemplet du gav skulle man t.ex enkelt kunna logga in genom att ange användarnamnet "' OR 1=1--", eller dylikt.
SqlCommand myCommand = new SqlCommand("select * from Anvandare where AnvNamn = @AnvNamn AND AnvPass = @AnvPass", myConnection);
myCommand.Parameters.Add("@AnvNamn",SqlDbType.VarChar,50).Value=UserName.Text;
myCommand.Parameters.Add("@AnvPass",SqlDbType.VarChar,50).Value=UserPass.Text;
Tack, bra tips. En sak jag stör mig på är att jag inte får rätt på detta. Vill lagra användarens ID-nummer i en session.
" Exception Details: System.InvalidOperationException: Invalid attempt to read when no data is present."
Verkar inte heller finnas någon vettig syntax för att nå det datan genom kolumnnamnet.
SqlCommand myCommand = new SqlCommand("select * from Anvandare where AnvNamn = @AnvNamn AND AnvPass = @AnvPass", myConnection);
myCommand.Parameters.Add("@AnvNamn",SqlDbType.VarChar,50).Value=UserName.Text;
myCommand.Parameters.Add("@AnvPass",SqlDbType.VarChar,50).Value=UserPass.Text;
SqlDataReader dr = myCommand.ExecuteReader();
if (dr.HasRows) {
Message.Text = "lyckades";
[b]Session["UserID"] = dr.GetInt32(0);[/b]
FormsAuthentication.RedirectFromLoginPage(UserName.Text, PersistCookie.Checked);
} else {
Message.Text = "lyckades inte";
PanelLogIn.Visible = true;
}
...
edit. Jag undrar även hur en rad som denna ska se ut om man ska ha en int som parameter.
myCommand.Parameters.Add(new SqlParameter("@FelAnvID", SqlDbType.NVarChar, 300));
trexter skrev:
" Exception Details: System.InvalidOperationException: Invalid attempt to read when no data is present."
Då måste köra en Read() på Readern för att få ut data. Byt ut HasRows till Read()
trexter skrev:
Verkar inte heller finnas någon vettig syntax för att nå det datan genom kolumnnamnet.
Session["UserID"] = (int)dr["UserID"];
trexter skrev:
edit. Jag undrar även hur en rad som denna ska se ut om man ska ha en int som parameter.
myCommand.Parameters.Add(new SqlParameter("@FelAnvID", SqlDbType.NVarChar, 300));
Allt detta finns mycket väldokumenterat. Om du använder VS eller VWD så ger det sig själv, med hjälp av IntelliSense.
myCommand.Parameters.Add("@FelAnvID", SqlDbType.Int).Value=12345;
...