webForumDet fria alternativet

Enkel fråga om kontroller

.NET

6 svar · 421 visningar · startad av trexter

Medlem sedan mars 20021 889 inlägg
Frågan#1

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?

Medlem sedan juli 20011 084 inlägg
#2

Panel eller PlaceHolder?

Medlem sedan mars 20021 889 inlägg
#3

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);
Medlem sedan dec. 19996 721 inlägg
#4

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;
Medlem sedan mars 20021 889 inlägg
#5

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));
Medlem sedan dec. 19996 721 inlägg
#6

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;
Medlem sedan mars 20021 889 inlägg
#7

...

269 ms totalt · 4 externa anrop · v20260731065814-full.868a69e5
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)