by Piotrosz
25. September 2008
Powiadomienie o nieprzechwyconym wyjątku w aplikacji www w za pomocą zdarzenia Application_Error w pliku Global.asax:
void Application_Error(object sender, EventArgs e)
{
if (Server.MachineName != "NazwaKomputeraLokalnego")
{
Exception error = Server.GetLastError();
Server.ClearError(); // O tym trzeba pamiętać
// Kod wysyłający e-mail na adres administratora
// ...
}
}
Dodany został też warunek, by nie był wysyłany e-mail, jeśli aplikacja jest odpalona na lokalnym IIS.
by Piotrosz
24. September 2008
Bardzo częsty problem. Na stronie jest GridView z możliwością edycji i usuwania wierszy. Warto wtedy dodać javascriptowe okienko wyskakujące przy kliknięciu na LinkButton z napisem "Usuń", by uniknąć przypadkowego usunięcia rekordu (gdy np. ktoś pomyli się i zamiast na link "Edytuj" kliknie na link "Usuń"). Wykorzystać można do tego właściwość OnClientClick kontrolki LinkButton:
Wtedy po kliknięciu na link z napisem "Usuń" wiersz nie jest usuwany natychmiast, ale pojawi się dodatkowe okienko potwierdzające:

by Piotrosz
23. September 2008
Przykład związany z zapisywaniem i odczytywaniem ciasteczek na stronach .aspx:
public partial class state_management_Cookies : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Response.Cookies["OstatniaWizyta"] != null)
Label1.Text = string.Format("{0}: {1}", Request.Cookies["OstatniaWizyta"].Name, Server.HtmlEncode(Request.Cookies["OstatniaWizyta"].Value));
else
Label1.Text = "Nie ma ciastka";
// Ograniczanie zakresu widoczności ciastka w aplikacji
Response.Cookies["OstatniaWizyta"].Value = DateTime.Today.ToString();
Response.Cookies["OstatniaWizyta"].Expires = DateTime.Today.AddDays(2);
Response.Cookies["OstatniaWizyta"].Path = "/state_management";
// Cookie zapisywane dla określonej domeny
Response.Cookies["Imie"].Value = "Adam";
Response.Cookies["Imie"].Domain = "piotrosz.aspnet.pl";
// Podwójnie indeksowane ciastko
Response.Cookies["Ulubiony"].Values.Add("Kolor", "Czarny");
Response.Cookies["Ulubiony"].Values.Add("Film", "Fanny i Alexander");
Response.Cookies["Ulubiony"].Values.Add("Owoc", "Trudno powiedzieć");
// Wyświetlenie wartości zapisanej
Label2.Text = Server.HtmlEncode(Request.Cookies["Ulubiony"]["Kolor"]);
}
}
Wartości ciasteczek można też podejrzeć po dodaniu śledzenia strony (Trace="true") w pliku .aspx:
<%@ Page Language="C#" AutoEventWireup="true" Trace="true" CodeFile="Cookies.aspx.cs" Inherits="state_management_Cookies" %>
Będzie to wyglądało tak:
by Piotrosz
19. September 2008
Przykład prezentujący używanie transakcji w C# przy operacjach na bazie danych. Tutaj wykonywane są 2 operacje. Jeśli jedna z
nich nie powiedzie się lub zostanie rzucony wyjątek, to transakcja zostanie cofnięta (Rollback). W przypadku, gdy obie
operacje powiodą się, transakcja zostanie potwierdzona i wykonana jako jedna atomowa operacja:
bool success = true;
SqlConnection conn = null;
SqlTransaction trans = null;
try
{
conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnStr"].ConnectionString);
conn.Open();
trans = conn.BeginTransaction(System.Data.IsolationLevel.Serializable);
// Pierwsza operacja w transakcji
using (SqlCommand command1 = new SqlCommand("sp_UpdateSomething", conn, trans))
{
command1.CommandType = CommandType.StoredProcedure;
success = (command1.ExecuteNonQuery() == 1);
}
// Druga operacja w transakcji
using (SqlCommand command2 = new SqlCommand())
{
command2.Connection = conn;
command2.Transaction = trans;
command2.CommandType = CommandType.Text;
command2.CommandText =
string.Format("INSERT INTO NazwaTabelki ([kol1], [kol2]) VALUES (@val1, @val2)");
command2.Parameters.Add("@val1", SqlDbType.VarChar).Value = "Costam";
command2.Parameters.Add("@val2", SqlDbType.DateTime).Value = DateTime.Now;
success = (command2.ExecuteNonQuery() == 1);
}
}
catch(SqlException ex)
{
success = false;
}
catch(Exception ex)
{
success = false;
}
finally
{
if (success)
trans.Commit();
else
trans.Rollback();
if (conn != null)
conn.Close();
}
by Piotrosz
18. September 2008
Metoda Server.MapPath() zwraca bezwzględną ścieżkę do określonego poprzez względną ścieżkę katalogu:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Label1.Text = Server.MapPath("Uploads");
Label2.Text = HttpContext.Current.Server.MapPath("Uploads");
}
}
Po odpaleniu takiej strony w obu etykietach wyświetlą się takie same teksty, np: "D:\projekty\StronaTestowa\Uploads".