Posts

Showing posts from 2008

JQuery si WebMethod

Prin noiembrie 2006 descoperisem la HALO interactive posibilitatea de a apela dintr-o pagina HTML o metoda dintr-o pagina aspx folosind un ScriptManager. Trebuia sa fac o autentificare in doi pasi. ScriptManger-ul genereaza ceva JavaScript folosit pentru a construi apelul AJAX, dar si pentru a folosi o sintaxa de genul PageMethods.MethodName, valabila atata timp cat e setata true optiunea EnablePageMethods.
Mult mai usor de scris e insa atunci cand se foloseste JQuery. O dezbatere am gasit aici.
Vreau doar sa dau un exemplu intersant de folosit intr-un shopping cart. Intr-un astfel de site exista cred mai multe pagini statice, decat dinamice. Adica fizic mai multe html-uri decat aspx-uri. Acum pe fiecare pagina html sau aspx apare undeva in pagina numarul de produse puse in cos. Daca ar fi sa se aleaga Master Pages pentru a-l afisa, odata ce se adauga o pagina noua in site trebuie recompilat tot situl. Solutia cea mai buna e sa se foloseasca AJAX. Partea frumoasa e ca poti face cumparat…

Conversie data pentru cultura romana (ro-RO)

Vreau sa convertesc date calendaristice din cultura romana (ro-RO) din string in DateTime. Datele sunt de genul 8 Oct 2008, 9 Oct 2008, 12 Dec 2008. DateTime.TryParseExact accepta formatul "d MMM yyyy", numai ca pentru cultura romana datele trebuie sa fie de forma 8 Oct. 2008, 9 Oct. 2008, 12 Dec. 2008 (cu punct dupa luna). Obtin expresia regulata pentru gasirea lunii din data, iar dupa luna inserez punctul.
Pentru asta am nevoie de un MatchEvaluator care e un delegat cu signatura delegate string MatchEvaluator(Match m)

static string Evaluator(Match match) {
return match.ToString() + ".";
}

Evolutia pointerilor la functii incepand de la C# 1.0 pana la C# 3.0 e una pozitiva, in sensul claritatii codului. Daca in 1.0 trebuia sa scrii efectiv metoda ca membru al unei clase, iar in 2.0 nu e tocmai naturala inserararea codului printre parametri, in 3.0 expresiile lambda simplifica mult tehnica.



var strDate = "8 Oct 2008";
var regForReplace = new Regex(@"[…

null == null ?

Test:

T - SQL:

if ( null = null )
print 'null == null'
else
print 'null != null'

C#:

Console.WriteLine(null == null);


Ce afiseaza fiecare? Si de ce?

O fi fost vreun bug in Google Chrome?

Image
Ca si istoric, am vrut sa inspectez un element img cu imaginea inexistenta ( adica lipsea de pe server)



Spre deosebire de FireFox, nu imi da optiunea de a restaura sesiunea dinaintea erorii.

Despre CompositeDataBoundControl

CompositeDataBoundControl este clasa de baza pentru DetailsView, FormView si GridView si are o metoda abstracta ce trebuie implementata de orice clasa mostenitoare.

protected abstract int CreateChildControls(IEnumerable dataSource, bool dataBinding);

dataBinding reprezinta:
-true: controlul va fi construit pe baza unui dataSource
-false: controlul se va reconstrui din ViewState
DetailsView, FormView sau GridView ofera diverse templaturi: de edit, de view sau atunci cand nu exista date in dataSource poti sa arati un anumit mesaj ce prezinta aceasta stare. Ca idee un template face legatura intre date si HTMLul scris de developer la design time, adica separa prezentarea de implementare.Din urmatorul Xml, care reprezinta organizarea unei anumite firme, as vrea sa obtin un control care sa arate ierarhia din acea firma, adica un fel de tree. Xmlul are 3 niveluri: Managers urmat de Sales, Development si Administrative, fiecare la randul lui avand alte diverse categorii de angajati. Fiecare catego…

Operatorul APPLY in SQL 2005

CREATE TABLE dbo.Items
(
ID int IDENTITY(1,1) NOT NULL,
Name varchar(50) NOT NULL,
CONSTRAINT PK_Items PRIMARY KEY (ID ASC)
)
-- Ceva valori
GO
INSERT INTO Items VALUES ('X')
INSERT INTO Items VALUES ('Y')
INSERT INTO Items VALUES ('Z')

-- O functie care returneaza itemurile care au id-ul mai mic decat @ItemID (cele anterioare unui anumit item)
GO
CREATE FUNCTION [dbo].[getPreviousItems]
(
@ItemID int
)
RETURNS @PreviousItemTab TABLE
(
ID int,
Name varchar(50)
)
AS

BEGIN

INSERT INTO @PreviousItemTab
SELECT *
FROM dbo.Items AS i
WHERE i.ID < @ItemID

RETURN
END


Operatorul APPLY implica doi operanzi, primul operand (LEFT) actioneaza ca si input pentru cel de-al doilea (RIGHT). Pentru fiecare linie din rezultatul operandului LEFT se va evalua operandul RIGHTOperatorul APPLY e de doua tipuri: CROSS APPLY si OUTER APPLY. Rezultatul lui CROSS APPLY nu va include liniile pentru care LEFT returneaza NULL in urma evaluarii, iar OUTER APPLY va include si aceste linii, pentru care evalua…

IsPostBack

MSDN spune ca proprietatea IsPostBack e o valoare care indica daca pagina este creata pentru a fi raspunsul postbackului unui client sau pagina este creata si accesata pentru prima data. Cuvantul cheie e postback, de fapt ce inseamna acest postback. Perceptia generala e ca IsPostBack e true atunci cand utilizatorul da click pe un buton sau pe un control dintr-o anumita pagina, care are setata proprietatea AutoPostBack = true (dropdown de exemplu).. sau hai sa zicem pe orice control cu evenimente care se instantiaza pe server in urma unei actiuni a utilizatorului in fereastra browserului.Mai altfel zis, Popescu, avid de monden, deschide browseru, scrie http://www.web.com/Clasamente.aspx, ii apare pagina frumoasa, care il invita sa dea click pentru a vedea clasamentul celor mai naspa vedete din Romania. Developerul presupune la PageLoad ca Page.IsPostBack e true, adica Popescu sigur avea deja pagina incarcata in browser, inainte de a accesa clasamentul celor mai naspa vedete din Romani…

Un bug in LINQ

Image
Am dat de un mic bug in LINQ to SQL, ce m-a facut sa-mi regandesc o abordare dintr-un anumit proiect. Eroarea apare in interiorul DataContext si anume la nivelul asocierii dintre clasele mapate pe tabele in scopul de a evidentia relatia 1:n.Sa explic insa cu un exemplu. Se da o baza de date cu trei tabele, o tabela cu categorii, o tabela cu produse si o tabela History, care contine istoria operatiilor pe celelalte doua. Pentru o anumita inregistrare din Products sau Categories vor exista una sau mai multe intrari(sau niciuna) in tabela History. Stiind un anumit HistoryGUID din Products sau Categories se pot afla inregistrarile din History, adica istoria operatiilor facute pentru o anumita inregistrare din oricare tabele. Cum HistoryGUID este generat automat de SQL Server cu newid(), la inserarea unei noi inregistrari intr-o tabela din cele doua, atunci e asigurata unicitatea lui la nivel de baza de date, conditie necesara pentru a identifica corect cumulul de inregistrari in History a…

Reindexare in SQL 2000

Multe aplicatii ASP .Net au in spate si un server de baze de date. Ce tre’ sa faci atunci cand pagini cu diverse rapoarte se incarca tot mai greu de la o saptamana la alta, primesti erori de timeout tot mai des pe mail, iar clientii incep sa devina din ce in ce frustrati? Incepi sa gugalesti:). Presupun ca pe tabelele alea mari sunt deja construiti niste indecsi, iar indecsii au peste 1000 pagini (adica peste 8000 KB).O idee ar fi sa se reverifice cum sunt construiti indecsii. Daca raportul e construit pe baza unei interogari care ordoneaza randurile dupa col1 ASC si col2 DESC si raportul e cerut destul de des, atunci indexul ar trebuie sa fie construit la fel (adica dupa col1 ASC si col2 DESC). Daca indexul are un fill factor de 100% (sau 0%) si pe tabela se fac la fel de des si operatii de insert,update sau delete atunci ar trebui reconsiderata valoarea acestui fill factor la una sub 100%. Cum un raport returneaza si alte coloane in afara de cele folosite in clause WHERE sau la ORDE…

HTML Parser sau Expresii Regulate

Extrag informatie dintr-o pagina si ma intreb cum anume sa procedez. Sa folosesc expresii regulate sau un parser html. Norocul meu e ca am gasit unul deja implementat de un anume tip Alex Chudnovsky, iar .Net imi ofera suport si pentru expresii regulate.Am luat ca test prima pagina a sitului ejobs, din care vreau sa extrag lista de orase din tagul HTML select.

<select name="oras" class="input12" style="width:130px;" >
<option value="">Toate orasele</option>
<option value="262" >Abrud</option>
...
<option value="298" >Zlatna</option>
</select>

Expresii Regulate
Am avut nevoie de doua expresii regulate. Una pentru a extrage toate tagurile <option></option> din acel <select>

(?<selectOrasInput> // constructie pentru a marca grupul in RegExp
<select //inceput de tag
((?:.|\n)*?) //orice intre tag si atribu…

LINQ to XML in ASP .Net

Image
Un alt mod de a stoca si manipula date este familia XML. Datele din fisiere sunt constranse sa respecte un anumit model, prin schemele XSD. Cu XPath se colecteaza date, iar cu XSLT fisierul sau setul de noduri se "converteste" in alt model de reprezentare (HTML, XML,..).Am imprumutat o parte din baza de date Northwind din SQL si am construit un fisier XML care contine un model relational. Astfel exista o lista de noduri de tip "produs" (tabela Products),o lista de tip "categorie" (tabela Categories) si o lista de noduri de tip "furnizor" (tabela Suppliers). Fiecare lista contine cate o cheie primara (xs:key). Pentru lista "Products" sunt definite chei straine care referentiaza la elemente din listele "Categories" sau "Suppliers" (xs:keyref). Cu xs:unique s-a constrans ca numele categoriilor/furnizorilor sa fie unic (Unique Constraint in SQL).

Fisier xml: lista de produse, categorii si furnizori.


<?xml version=&qu…