login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Ik wil een Csharp.net gastenboek bouwen in 15 minuutjes (Opgelost)

Offline Martijn2008 - 14/11/2009 13:01 (laatste wijziging 14/11/2009 13:05)
Avatar van Martijn2008PHP beginner Dag allemaal,

Ik wil graag de kracht voelen van het .NET platform. Mijn bedoeling is zo snel en efficiënt mogelijk een Csharp.net gastenboek in elkaar te zetten. Graag hoor ik jullie ervaringen en tips over de aanpak.

Bedankt alvast voor jullie hulp!

Martijn.

P.s. Hoe voeg ik eigenlijk het IP-adres en timestamp toe aan de berichten??

Code die ik momenteel al heb is de volgende(Ik vraag me af hoe ik kan aantonen, dat de query gelukt is?):

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. using System.Data.SqlClient;
  8.  
  9. public partial class Guestbook : System.Web.UI.Page
  10. {
  11. protected void Page_Load(object sender, EventArgs e)
  12. {
  13.  
  14. }
  15. protected void Button1_Click(object sender, EventArgs e)
  16. {
  17. SqlConnection conn;
  18. conn = new SqlConnection();
  19. conn.ConnectionString = new DB().ConnectionString();
  20.  
  21. conn.Open();
  22.  
  23. SqlCommand insertMessage = new SqlCommand("INSERT INTO guestbook (name, email, message) VALUES ('" + txtName + "', '" + txtEmail + "', '" + txtMessage + "')", conn);
  24. insertMessage.ExecuteNonQuery();
  25.  
  26. conn.Close();
  27. }
  28. }

15 antwoorden

Gesponsorde links
Offline Abbas - 14/11/2009 13:10
Avatar van Abbas Gouden medaille

Crew .NET
Die code zal sowieso niet werken. Ik ga er van uit dat txtName, txtEmail en txtMessage de tekstvakken zijn en geen variabelen (ik zie namelijk geen declaratie). Wel nu, je kan toch geen TextBox in een database stoppen, je moet de Text eruit halen en gebruiken. Even veranderen naar: txtName.Text ! Een ander punt is bijvoorbeeld om Server.HtmlEncode() te gebruiken, nu is je invoer helemaal niet beveiligd. Als laatste zou ik zeggen, gooi alles qua database - werk eens in try catch voor als er iets misgaat (dit heet Exception Handling):

  1. //Connection instellen
  2. //String met query maken en dan..
  3.  
  4. try
  5. {
  6. //verbinding openen
  7. //query uitvoeren
  8. }
  9. catch (Exception ex)
  10. {
  11. //fouten opvangen
  12. }
  13. finally
  14. {
  15. //verbinding sluiten
  16. //finally wordt ALTIJD uitgevoerd
  17. }

Toch nog een puntje, ik bekijk deze regel:

  1. conn.ConnectionString = new DB().ConnectionString();

Zorg er eens voor dat je in je class DB de methode ConnectionString() statisch maakt zodat je kan doen:

  1. conn.ConnectionString = DB.ConnectionString();

Veel succes in ieder geval, en anders bekijk je dit script maar eens: http://www.site...Gastenboek . Hou er wel rekening mee dat het wat verouderd is! 
Offline Martijn2008 - 14/11/2009 17:25 (laatste wijziging 14/11/2009 17:49)
Avatar van Martijn2008 PHP beginner Ik heb nu een aantal wijzigingen aan de hand van Titjes advies gemaakt. Ik ben benieuwd wat jullie ervan vinden? Hoe voeg ik eigenlijk het IP-adres en timestamp toe? Hoe kan ik de gastenboek berichten het gemakkelijkst tonen met paging(Gridview of is een label toch handiger?)?

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. using System.Data.SqlClient;
  8.  
  9. public partial class Guestbook : System.Web.UI.Page
  10. {
  11. protected void Page_Load(object sender, EventArgs e)
  12. {
  13.  
  14. }
  15. protected void Button1_Click(object sender, EventArgs e)
  16. {
  17. SqlConnection conn;
  18. conn = new SqlConnection();
  19. conn.ConnectionString = new DB().ConnectionString();
  20.  
  21. try
  22. {
  23. conn.Open();
  24. SqlCommand insertMessage = new SqlCommand("INSERT INTO guestbook (name, email, message) VALUES ('" + Server.HtmlEncode(txtName.Text) + "', '" + Server.HtmlEncode(txtEmail.Text) + "', '" + Server.HtmlEncode(txtMessage.Text) + "')", conn);
  25. insertMessage.ExecuteNonQuery();
  26. lblResult.Text = "Uw bericht is met succes toegevoegd";
  27. }
  28. catch (Exception ex)
  29. {
  30. lblResult.Text = "Er zijn onverwachts fouten opgetreden.";
  31. }
  32. finally
  33. {
  34. conn.Close();
  35. }
  36. }
  37. }
Offline Abbas - 14/11/2009 18:12
Avatar van Abbas Gouden medaille

Crew .NET
Je hebt je ConnectionString() nog niet statisch gemaakt! 

Om de berichten van je gastenboek te tonen, kan je misschien best gebruik maken van de ASP Repeater Control.

Het IP adres haal je zo op:

  1. HttpContext.Current.Request.UserHostAddress;

En een Timestamp haal je gewoon op via DateTime.
Offline Martijn2008 - 15/11/2009 16:40 (laatste wijziging 15/11/2009 16:44)
Avatar van Martijn2008 PHP beginner Misschien een hele arrogante vraag, maar hoe maak ik een connectionstring statisch ?

Ik heb nu trouwens een probleempje; de action die ik achter de submit button heb staan, wordt steeds gevangen in de catch. Ik krijg dus nu de error: Er zijn onverwachts fouten opgetreden.

Csharp code:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. using System.Data.SqlClient;
  8.  
  9. public partial class Guestbook : System.Web.UI.Page
  10. {
  11. protected void Page_Load(object sender, EventArgs e)
  12. {
  13. if (Request.QueryString["res"] != null)
  14. {
  15. lblResult.Text = "Uw bericht is met succes toegevoegd";
  16. }
  17. }
  18. protected void Button1_Click(object sender, EventArgs e)
  19. {
  20. SqlConnection conn;
  21. conn = new SqlConnection();
  22. conn.ConnectionString = new DB().ConnectionString();
  23.  
  24. try
  25. {
  26. conn.Open();
  27.  
  28. SqlCommand insertMessage = new SqlCommand("INSERT INTO guestbook (name, email, message, ip) VALUES ('" + Server.HtmlEncode(txtName.Text) + "', '" + Server.HtmlEncode(txtEmail.Text) + "', '" + Server.HtmlEncode(txtMessage.Text) + "', '" + HttpContext.Current.Request.UserHostAddress + "')", conn);
  29. insertMessage.ExecuteNonQuery();
  30.  
  31. txtName.Text = "";
  32. txtEmail.Text = "";
  33. txtMessage.Text = "";
  34.  
  35. Response.Redirect("Guestbook.aspx?res=1");
  36. }
  37. catch (Exception ex)
  38. {
  39. lblResult.Text = "Er zijn onverwachts fouten opgetreden.";
  40. }
  41. finally
  42. {
  43. conn.Close();
  44. }
  45. }
  46. }


view:

  1. <%@ Page Title="" Language="C#" MasterPageFile="~/Default.master" AutoEventWireup="true" CodeFile="Guestbook.aspx.cs" Inherits="Guestbook" %>
  2.  
  3. <asp:Content ID="Content1" ContentPlaceHolderID="Main" Runat="Server">
  4.  
  5. <h3>Guestbook</h3>
  6.  
  7. <asp:Repeater ID="Repeater1" runat="server"
  8. DataSourceID="SqlDataSource1">
  9. </asp:Repeater>
  10. <asp:SqlDataSource ID="SqlDataSource1" runat="server"
  11. ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
  12. SelectCommand="SELECT [ip], [time], [message], [email], [name] FROM [guestbook]">
  13. </asp:SqlDataSource>
  14.  
  15.  
  16. <div class="box">
  17. <table style="width: 100%">
  18. <tr>
  19. <td>
  20. <asp:Label ID="Name" runat="server" Text="Name"></asp:Label>
  21. </td>
  22. <td>
  23. <asp:TextBox ID="txtName" runat="server"></asp:TextBox>
  24. </td>
  25. <td>
  26. <asp:RequiredFieldValidator ID="strNameReqValidator" runat="server"
  27. ControlToValidate="txtName" ErrorMessage="Veld name is leeg">*</asp:RequiredFieldValidator>
  28. </td>
  29. </tr>
  30. <tr>
  31. <td>
  32. <asp:Label ID="Email" runat="server" Text="E-mail"></asp:Label>
  33. </td>
  34. <td>
  35. <asp:TextBox ID="txtEmail" runat="server"></asp:TextBox>
  36. </td>
  37. <td>
  38. <asp:RequiredFieldValidator ID="RequiredFieldValidatorEmail" runat="server"
  39. ControlToValidate="txtEmail" ErrorMessage="Veld e-mail is leeg">*</asp:RequiredFieldValidator>
  40. <asp:RegularExpressionValidator ID="RegularExpressionValidatorEmail"
  41. runat="server" ControlToValidate="txtEmail"
  42. ErrorMessage="E-mailadres valideert niet"
  43. ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*">*</asp:RegularExpressionValidator>
  44. </td>
  45. </tr>
  46. <tr>
  47. <td>
  48. <asp:Label ID="Message" runat="server" Text="Message"></asp:Label>
  49. </td>
  50. <td>
  51. <asp:TextBox ID="txtMessage" runat="server"></asp:TextBox>
  52. </td>
  53. <td>
  54. <asp:RequiredFieldValidator ID="RequiredFieldValidatorMessage" runat="server"
  55. ControlToValidate="txtMessage" ErrorMessage="*">*</asp:RequiredFieldValidator>
  56. </td>
  57. </tr>
  58. <tr>
  59. <td>
  60. &nbsp;</td>
  61. <td>
  62. <asp:Button ID="Submit" runat="server" onclick="Button1_Click" Text="Submit" />
  63. </td>
  64. <td>
  65. <asp:Label ID="lblResult" runat="server"></asp:Label>
  66. </td>
  67. </tr>
  68. </table>
  69. </div>
  70.  
  71. </asp:Content>

Offline Abbas - 15/11/2009 18:33
Avatar van Abbas Gouden medaille

Crew .NET
Doe dan in de catch eens dit:

  1. catch (Exception ex)
  2. {
  3. lblResult.Text = ex.Message;
  4. }

Stel je hebt volgende klasse:

  1. public class DB
  2. {
  3. public static string GetConnectionString()
  4. {
  5. return "Uwe connectionstring";
  6. }
  7. }
  8.  
  9. //aanroep is dan
  10. SqlConnection myConn = new SqlConnection();
  11. myConn.ConnectionString = DB.GetConnectionString();

Waarom ga je na de submit naar de pagina Guestbook.aspx?res=1 ? Als ik er rechtsreeks naartoe ga krijg ik die melding terwijl er niets is toegevoegd.

Volgende code werkt beter:

  1. if(insertMessage.ExecuteNonQuery() == 1)
  2. {
  3. //Bericht succesvol toegevoegd en weergeven
  4. }
Offline Martijn2008 - 15/11/2009 19:40 (laatste wijziging 15/11/2009 19:41)
Avatar van Martijn2008 PHP beginner Hehe, dat ex.Message brengt de oplossing. Cannot insert value null into column `time`.

Maar nu reist de volgende vraag in me op. Hoe zorg ik er dan voor dat kolom time gevuld wordt? Heb deze kolom ingesteld op datatype DATETIME. Dacht dat dit automatisch ging als er een nieuwe rij werd toegevoegd .
Offline Abbas - 15/11/2009 19:44 (laatste wijziging 15/11/2009 20:03)
Avatar van Abbas Gouden medaille

Crew .NET
Nee nee tuurlijk niet! Je moet gewoon voor die kolom bijvoorbeeld als value DateTime.Now meegeven. 

Edit:
Zijn de andere puntjes al opgelost?
Offline Martijn2008 - 15/11/2009 20:02 (laatste wijziging 15/11/2009 20:03)
Avatar van Martijn2008 PHP beginner Ik gebruik nu DateTime.Now om veld `time` te vullen. Krijg hierop de volgende error: The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value. The statement has been terminated.

P.s. Waar vind ik in Visual Studio eigenlijk de textarea in mijn toolbox ?
Offline Abbas - 15/11/2009 20:07
Avatar van Abbas Gouden medaille

Crew .NET
Je hebt geen textarea in ASP.NET, dit blijft een TextBox waarvan je de TextMode op "MultiLine" zet en dan stel je via Rows en Columns de grootte in, net zoals bij de textarea.

Heb je nu ook die if(insert... == 1) gebruikt en je ConnectionString - methode statisch gemaakt?

In verband met de datetime: http://forums.asp.net/t/1250168.aspx
Offline Martijn2008 - 15/11/2009 20:20 (laatste wijziging 15/11/2009 20:21)
Avatar van Martijn2008 PHP beginner Textarea maken is gelukt, ThnX. Ik heb enkel nog steeds dat conversie probleem. Ik denk dat ik hetzelfde probleem heb wat betreft DateTime format. Mijn code behind ziet er nu zo uit:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. using System.Data.SqlClient;
  8.  
  9. public partial class Guestbook : System.Web.UI.Page
  10. {
  11. protected void Page_Load(object sender, EventArgs e)
  12. {
  13.  
  14. }
  15. protected void Button1_Click(object sender, EventArgs e)
  16. {
  17. SqlConnection conn = new SqlConnection();
  18. conn.ConnectionString = DB.ConnectionString();
  19.  
  20. try
  21. {
  22. conn.Open();
  23.  
  24. SqlCommand insertMessage = new SqlCommand("INSERT INTO guestbook (name, email, message, ip, time) VALUES ('" + Server.HtmlEncode(txtName.Text) + "', '" + Server.HtmlEncode(txtEmail.Text) + "', '" + Server.HtmlEncode(txtMessage.Text) + "', '" + HttpContext.Current.Request.UserHostAddress + "', '" + DateTime.Now + "')", conn);
  25.  
  26. if (insertMessage.ExecuteNonQuery() == 1)
  27. {
  28. txtName.Text = "";
  29. txtEmail.Text = "";
  30. txtMessage.Text = "";
  31.  
  32. lblResult.Text = "Uw bericht is met succes toegevoegd";
  33. }
  34. }
  35. catch (Exception ex)
  36. {
  37. lblResult.Text = ex.Message;
  38. }
  39. finally
  40. {
  41. conn.Close();
  42. }
  43. }
  44. }
Offline Abbas - 15/11/2009 21:26 (laatste wijziging 15/11/2009 23:25)
Avatar van Abbas Gouden medaille

Crew .NET
Als je met MS SQL Server werkt zet dan het type van je datumveld eens op 'datetime', of staat het daar al op? Zo ja, let dan op de notatie zoals in de link staat die ik je gaf.

Edit:
Ik heb ook even een gastenboek in elkaar geknutseld. Ik heb dit gebruikt en dat werkt wel voor de datum (Databaseveld staat op 'datetime'):

  1. DateTime.Now.Date.ToShortDateString()
Offline Martijn2008 - 16/11/2009 00:08 (laatste wijziging 16/11/2009 00:21)
Avatar van Martijn2008 PHP beginner Ik had het probleem zonet even opgelost door het datatype van de kolom in mijn database te veranderen naar een varchar(50). Heb ook even jouw oplossing getest. Heb dus kolom time weer terug gezet op datatype DATETIME en heb de wijziging in de code gemaakt die je hierboven als mogelijke oplossing geeft. Tot mijn grote teleurstelling krijg ik nog altijd dezelfde foutmelding met die configuratie.
Offline Abbas - 16/11/2009 00:55
Avatar van Abbas Gouden medaille

Crew .NET
Maak er dan anders gewoon een nchar/varchar van en doe dan DateTime.Now.ToString(), dat moét wel lukken! 
Offline Martijn2008 - 16/11/2009 20:08
Avatar van Martijn2008 PHP beginner Super, dat werkt ! Kan ik ook iets doen tegen sp@m bots e.d. in ASP.net?
Offline Abbas - 16/11/2009 20:11
Avatar van Abbas Gouden medaille

Crew .NET
http://www.asp....32-cs.aspx

En anders:

http://www.code...ntrol.aspx
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.207s