ASP.NET Test 2009-2010
Jan Van Ryckeghem
Inhoud Exceptionhandling
H4 ......................................................................................................................................... 3
Try … Catch
slide 25 ...................................................................................................................................... 3
Error pagina
slide 29 ...................................................................................................................................... 3
Error.aspx ........................................................................................................................................................ 3 Error.aspx.cs .................................................................................................................................................... 4 Web.config ...................................................................................................................................................... 4 Logbestand aanmaken .................................................................................................................................... 4 Masterpages
H5 .................................................................................................................................................. 5
In Visual Studio .................................................................................................................................................... 5 Aanmaken van de masterpage ....................................................................................................................... 5 Pagina koppelen aan de masterpage .............................................................................................................. 5 Gebruik masterpage
slide 11 ........................................................................................................................... 5
Titel toekennen aan web form ........................................................................................................................ 5 Content wijzigen .............................................................................................................................................. 5 Menu dynamisch aanpassen Themes en Skins
slide 13 .............................................................................................................. 6
slide 17 ................................................................................................................................. 6
Bierhalle.skin ................................................................................................................................................... 6 Default.aspx .................................................................................................................................................... 6 Validators
H6 ...................................................................................................................................................... 7
Aanmaken ........................................................................................................................................................... 7 Aanpassen ........................................................................................................................................................... 7 Gebruik van elke validator .................................................................................................................................. 7 ADO.NET
H7 ...................................................................................................................................................... 7
DAL: Data Acces Layer
slide 21 ........................................................................................................................ 7
DAL Controller ................................................................................................................................................. 7 BrouwerDOA Service Layer
slide 57 ................................................................................................................................. 7 zie bijlage 3 ............................................................................................................................... 8
Databaseconnectie .............................................................................................................................................. 8 Toevoegen via Server Explorer ........................................................................................................................ 8 Bijlage 1: DalController Bierhallen .......................................................................................................................... 9 Bijlage 2: BrouwerDOA .......................................................................................................................................... 11 Bijlage 3: BeheerBrouwersService ......................................................................................................................... 15
.
Exceptionhandling
H4
Try … Catch
slide 25
protected void buttonSaveExcuse_Click(object sender, EventArgs e) { try { excuse = new Excuse(textBoxExcuse.Text, textBoxResult.Text, calendarLatestUsed.SelectedDate); excuse.Save(GetPathAndFileName(textBoxExcuse.Text)); } catch (Exception ex) { labelFeedback.Text = ex.Message; } finally { FillDropdownListExcuses(); } }
Error pagina
slide 29
Error.aspx <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Error.aspx.cs" Inherits="Error" %>
Excuse Manager De webpagina waarop de fout getoond zal worden.
Exceptionhandling
H4
3
Error.aspx.cs public partial class Error : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { lbl404.Visible = (this.Request.QueryString["code"] != null && this.Request.QueryString["code"] == "404"); lbl408.Visible = (this.Request.QueryString["code"] != null && this.Request.QueryString["code"] == "408"); lbl505.Visible = (this.Request.QueryString["code"] != null && this.Request.QueryString["code"] == "505"); lblError.Visible = (string.IsNullOrEmpty(this.Request.QueryString["code"])); } } De achterliggende code van de error-pagina.
Web.config
<customErrors mode="On" defaultRedirect="~/Error.aspx"> <error statusCode="404" redirect="~/Error.aspx?code=404" /> <error statusCode="408" redirect="~/Error.aspx?code=408" /> <error statusCode="505" redirect="~/Error.aspx?code=505" /> Verwijzing naar de zelfgedefinieerde errors, en de error-webpagina.
Logbestand aanmaken Global.asax void Application_Error(object sender, EventArgs e) { using (StreamWriter w = File.AppendText(Server.MapPath("log.txt"))) { w.WriteLine("\r\nLog Entry : "); w.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(), DateTime.Now.ToLongDateString()); Exception objErr = Server.GetLastError().GetBaseException(); string err = "Error in: " + Request.Url.ToString() + ".\nError Message:" + objErr.ToString(); w.WriteLine(err); w.WriteLine("__________________________"); w.Flush(); } }
Exceptionhandling
H4
4
Masterpages
H5
In Visual Studio Aanmaken van de masterpage
Pagina koppelen aan de masterpage
Volledig project: <pages masterPageFile="~/RelatieveUrlVanMasterpage">
Gebruik masterpage
slide 11
Titel toekennen aan web form protected void Page_Load(object sender, EventArgs e) { Page masterpage = this.Master.Page; masterpage.Header.Title = "BIERHALLE: HOME"; }
Content wijzigen In masterpage.master.cs public string PageTitel { set { labelTitel.Text = value; } } In web form: ((Masterpages_Bierhalle)Master).PageTitel = "Titel"; Masterpages
H5
5
Menu dynamisch aanpassen
slide 13
protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { // Relatieve padnaam van huidige pagina opvragen string PageName = Page.AppRelativeVirtualPath; //MenuItems overlopen foreach (MenuItem i in menuMain.Items) { //MenuItem van huidige pagina wijzigen if (i.NavigateUrl == PageName) { i.Selected = true; i.Selectable = false; } //Login <> Logout aanpassen if (i.NavigateUrl.ToLower() == "~/login.aspx" || i.NavigateUrl.ToLower() == "~/site/logout.aspx") { if (Page.User.Identity.IsAuthenticated) { i.NavigateUrl = "~/Logout.aspx"; i.Text = "Logout"; i.Value = "Logout"; } else { i.NavigateUrl = "~/Login.aspx"; i.Text = "Login"; i.Value = "Login"; } } } } }
Themes en Skins
slide 17
Bierhalle.skin
Default.aspx textBoxVoornaam krijgt een andere skin aangemeten, dankzij het speciale ID bij de tweede textboxskin.
Masterpages
H5
6
Validators
H6
Aanmaken Via toolbox
Aanpassen Via properties
Gebruik van elke validator Zie slides H6 vanaf slide 8
ADO.NET
H7
DAL: Data Acces Layer
slide 21
DAL Controller Namespace: Bierhallen.DAL Façade voor DOA-mappers Code DALCOntroller: zie bijlage 1
BrouwerDOA
slide 57
Constructor private BrouwerDAO() { connectionString = ConfigurationManager. ConnectionStrings["Bieren"].ConnectionString; }
ConnectionString Server Explorer Data connections Properties van databanken toevoegen aan web.config
Singleton static public BrouwerDAO Instance{ get { if (instance == null) instance = new BrouwerDAO(); return instance;} }
Code brouwerDOA : zie bijlage 2
Validators
H6
7
Service Layer
zie bijlage 3
De service laag geeft de daadwerkelijke domein-objecten terug.
Databaseconnectie
SQL Server Database File
Map: App-Data
Toevoegen via Server Explorer
ADO.NET
H7
8
Bijlagen Bijlage 1: DalController Bierhallen namespace Bierhallen.DAL { public class DALController { private BrouwerDAO brouwerDAO = BrouwerDAO.Instance; private BierDAO bierDAO = BierDAO.Instance; private GebruikerDAO gebruikerDAO = GebruikerDAO.Instance; public List GetBrouwers() { return brouwerDAO.ReadAll(); } public Brouwer GetBrouwer(int brouwernr) { return brouwerDAO.Read(brouwernr); } public bool DeleteBrouwer(int brouwernr) { return brouwerDAO.Delete(brouwernr); } public bool UpdateBrouwer(Brouwer brouwer) { return brouwerDAO.Update(brouwer); } public int InsertBrouwer(Brouwer brouwer) { return brouwerDAO.Insert(brouwer); } #region BierDAO public List GetBieren() { return bierDAO.ReadAll(); } public Bier GetBier(int biernr) { return bierDAO.Read(biernr); } public List FindBierenByBrouwer(int brouwernr) { return bierDAO.FindByBrouwer(brouwernr); } public void InsertBier(int brouwernr, Bier bier) { bierDAO.Insert(bier); }
Bijlage 1: DalController Bierhallen
9
public int CountBierenForBrouwer(int brouwernr) { return bierDAO.CountBierenForBrouwer(brouwernr); } #endregion #region GemeenteDAO public List GetGemeenten() { return GemeenteDAO.Instance.ReadAll(); } public string FindGemeente(string postcode) { return GemeenteDAO.Instance.FindGemeente(postcode); } #endregion #region GebruikerDAO public Gebruiker GetGebruiker(int gebruikerId) { return gebruikerDAO.Read(gebruikerId); } public List FindGebruikersByNaam(string naam) { return gebruikerDAO.FindByName(naam); } public bool DeleteGebruiker(int gebruikerId) { return gebruikerDAO.Delete(gebruikerId); } public int InsertGebruiker(Gebruiker gebruiker) { return gebruikerDAO.Insert(gebruiker); } public bool UpdateGebruiker(Gebruiker gebruiker) { return gebruikerDAO.Update(gebruiker); } #endregion } } Code voor de DAL Controller van het project Bierhallen
Bijlage 1: DalController Bierhallen
10
Bijlage 2: BrouwerDOA namespace Bierhallen.DAL { public class BrouwerDAO { #region Fields private string connectionString; //Singleton pattern static private BrouwerDAO instance = null; #endregion #region Methods static public BrouwerDAO Instance { get { if (instance == null) instance = new BrouwerDAO(); return instance; } } private BrouwerDAO() { connectionString = ConfigurationManager.ConnectionStrings["Bieren"].ConnectionString; } public Brouwer Read(int brouwernr) { try { using (SqlConnection oConn = new SqlConnection(connectionString)) { oConn.Open(); string sqlString = "select B.*, G.Gemeente from Brouwers B join Gemeenten G on B.postcode = G.Postcode where B.brouwernr = @brouwernr"; SqlCommand oCmd = new SqlCommand(sqlString, oConn); oCmd.Parameters.Add(new SqlParameter("@brouwernr", brouwernr)); using (SqlDataReader oReader = oCmd.ExecuteReader(CommandBehavior.SingleRow)) { Brouwer brouwer = null; if (oReader.Read()) brouwer = GetBrouwerFromReader(oReader); return brouwer; } } } catch (SqlException ex) { throw new ApplicationException("Lezen brouwer met nr " + brouwernr.ToString() + " is mislukt.", ex); } }
Bijlage 2: BrouwerDOA
11
public List ReadAll() { try { using (SqlConnection oConn = new SqlConnection(connectionString)) { oConn.Open(); string sqlString = "select B.*, G.Gemeente from Brouwers B join Gemeenten G on B.postcode = G.Postcode order by naam"; SqlCommand oCmd = new SqlCommand(sqlString, oConn); using (SqlDataReader oReader = oCmd.ExecuteReader()) { return GetBrouwerCollectionFromReader(oReader); } } } catch (SqlException ex) { throw new ApplicationException("Lezen brouwers mislukt", ex); } } public bool Delete(int brouwernr) { try { using (SqlConnection oConn = new SqlConnection(connectionString)) { string sqlString = "delete from Brouwers where brouwernr = @brouwernr"; SqlCommand oCmd = new SqlCommand(sqlString, oConn); oCmd.Parameters.Add(new SqlParameter("@brouwernr", brouwernr)); oConn.Open(); int rowsAffected = oCmd.ExecuteNonQuery(); return (rowsAffected == 1); } } catch (SqlException ex) { throw new ApplicationException("Verwijderen brouwer mislukt", ex); } } public bool Update(Brouwer brouwer) { try { using (SqlConnection oConn = new SqlConnection(connectionString)) { string sqlString = "Update Brouwers set naam=@naam, adres=@adres,postcode=@postcode, omzet=@omzet where brouwernr=@brouwernr"; SqlCommand oCmd = new SqlCommand(sqlString, oConn); BuildBrouwerParamsFromEntity(brouwer, oCmd.Parameters); oConn.Open(); int rowsAffected = oCmd.ExecuteNonQuery(); Bijlage 2: BrouwerDOA
12
return (rowsAffected == 1); } } catch (SqlException ex) { throw new ApplicationException("Aanpassen brouwer mislukt", ex); } } public int Insert(Brouwer brouwer) { try { using (SqlConnection oConn = new SqlConnection(connectionString)) { string sqlString = "Insert into Brouwers (naam, adres, postcode,omzet) values(@naam,@adres,@postcode,@omzet);select scope_identity();"; SqlCommand oCmd = new SqlCommand(sqlString, oConn); BuildBrouwerParamsFromEntity(brouwer, oCmd.Parameters); oConn.Open(); int brouwernr = (int)(decimal)oCmd.ExecuteScalar(); return brouwernr; } } catch (SqlException ex) { throw new ApplicationException("Toevoegen brouwer mislukt", ex); } } public int Count() { try { using (SqlConnection oConn = new SqlConnection(connectionString)) { string sqlString = "select count(*) from brouwers"; SqlCommand oCmd = new SqlCommand(sqlString, oConn); oConn.Open(); return (int)oCmd.ExecuteScalar(); } } catch (SqlException ex) { throw new ApplicationException("Tellen brouwers mislukt", ex); } } #endregion #region "OR mappers tabel Brouwers" protected Brouwer GetBrouwerFromReader(IDataRecord oReader) { int brouwernr = (int)oReader["brouwernr"]; Bijlage 2: BrouwerDOA
13
string naam = oReader.GetString(1); Brouwer brouwer = new Brouwer(brouwernr, naam); brouwer.SetAdres((string)oReader["adres"], (string)oReader["postcode"], (string)oReader["gemeente"]); if (oReader["omzet"] != DBNull.Value) brouwer.Omzet = (int)oReader["omzet"]; else brouwer.Omzet = null; return brouwer; } protected List GetBrouwerCollectionFromReader(IDataReader oReader) { List brouwers = new List(); while (oReader.Read()) { brouwers.Add(GetBrouwerFromReader(oReader)); } return brouwers; } protected void BuildBrouwerParamsFromEntity(Brouwer brouwer, SqlParameterCollection pars) { if (brouwer.Brouwernr != 0) pars.Add(new SqlParameter("@brouwernr", brouwer.Brouwernr)); pars.Add(new SqlParameter("@naam", SqlDbType.NVarChar, 50)); pars["@naam"].Value = brouwer.Naam; pars.Add(new SqlParameter("@adres", SqlDbType.NVarChar, 50)).Value = brouwer.Straat; pars.Add(new SqlParameter("@postcode", SqlDbType.NChar, 4)); pars["@postcode"].Value = brouwer.Postcode; if (brouwer.Omzet.HasValue) pars.Add(new SqlParameter("@omzet", brouwer.Omzet)); else pars.Add(new SqlParameter("@omzet", DBNull.Value)); } #endregion } } Code voor de Brouwer DOA van het project Bierhallen
Bijlage 2: BrouwerDOA
14
Bijlage 3: BeheerBrouwersService namespace Bierhallen.Service { public class BeheerBrouwerService { private DALController dalController; public BeheerBrouwerService() { dalController = new DALController(); } public IEnumerable GetBrouwers() { return dalController.GetBrouwers(); } public Brouwer GetBrouwer(int brouwernr) { return dalController.GetBrouwer(brouwernr); } public void DeleteBrouwer(int brouwernr) { bool verwijderd = dalController.DeleteBrouwer(brouwernr); if (!verwijderd) throw new ApplicationException("Brouwer onbestaand"); } public int InsertBrouwer(string naam, string straat, string postcode, int? omzet) { string gemeente = dalController.FindGemeente(postcode); Brouwer brouwer = new Brouwer(naam, straat, postcode, gemeente, omzet); brouwer.Validate(); return dalController.InsertBrouwer(brouwer); } public void UpdateBrouwer(int brouwernr, string naam, string straat, string postcode, int? omzet) { Brouwer brouwer = dalController.GetBrouwer(brouwernr); if (brouwer == null) throw new ApplicationException("Brouwer onbestaand"); brouwer.Naam = naam; if (postcode != brouwer.Postcode || straat != brouwer.Straat) { string gemeente = dalController.FindGemeente(postcode); brouwer.SetAdres(straat, postcode, gemeente); } brouwer.Validate(); bool aangepast = dalController.UpdateBrouwer(brouwer); if (!aangepast) throw new ApplicationException("Brouwer onbestaand"); } public IEnumerable GetGemeenten() { return dalController.GetGemeenten(); } } } Bijlage 3: BeheerBrouwersService
15