Важни ли са мета таговете META-Description и META-KEYWORDS

by mitkoka 4. Декември 2008 15:33

Най - лесното нещо, което можете да направите за по - доброто индексиране на вашият сайт е да включите META-Description и META-KEYWORDS към страниците на вашият сайт. Гугъл използва съдържанието на META-Description, когато показва резултатите от търсенето(това е текстът, който се съдържа във всеки един от резултатите).META-KEYWORDS съдържа ключовите думи, чрез които търсачките категоризират уеб сайта. Те трябва да се съдържат и в тялото на сайта. Освен това е добре в текста на сайта тези думи да бъдат логически свързани.

Пъвоначално мета таговете са имали голяма тежест при индексирането на сайтовете. Това е давало възможност на уеб програмистите да злоупотребяват с тази особеннст и затова много търсещи машини са имали проблеми в това отношение. По - късно значението на тези тагове намалява и те в по малка степен определят как ще  се индексира дадена страница. На кратко казано днес те не са със същото значение както преди. Въпреки това нищо не ни коства да ги добавим към сайта, но незабравяте да ги включите и в тялото му.

Препоръчва се използването само на думи написъни с малки букви! 

Tags:

SEO

title,h1 и h2 трябва да са описателни.

by mitkoka 4. Декември 2008 14:51
Всеки уеб сайт трябва да съдържа тези тагове. За да бъде вашият сайт по - добре индексиран тези тагове трябва да описват добре страницата, а не да съдържат само една дума или пък изобщо да не са включени. <title>, <h1> и <h2> ще бъдат полезни и за посетителите на сайта ви. Те ще му дадат по - добра информация за съдържанието му.

Tags:

SEO

Колко и какви ключови думи да поставя в сайта си.

by mitkoka 4. Декември 2008 09:57

Изключително важно е правилно да подберете ключовите думи във вашия сайт. Правилният подбор до голяма степен ще определи позицията на сайта при търсене. Ето основното правило - ключовите думи намиращи се в meta тага трябва да се съдържат в текста на страницата и по възможност в първите 2 -3 параграфа.

Ето стъпките:

1.Определете кои са ключовите думи най- добре съответстващи на вашия сайт. Тук става въпрос не само за отделни думи, но и фрази, по които желаете вашия сайт да бъде намиран.

2.Текстът в конкретната страница притежаваща избраните ключови думи трябва да съдържа тези думи в себе си. Ако например сте избрали ключови думи "билярдни маси","биляд"," обурудване", "дарц", "билярдно обурудване" тези думи трябва да фигурират в текста към страницата и то колкото се може по - напред в текста. Например: "Предлагаме на вашето внимание билярдни маси и всякакво билярд обурудване. Освен това при нас можете да намерите дарц машини...." и т.н.т.

3.Обсъдете с вашият програмист възможността всяка една страница от вашия сайт да съдържа точно определени ключови думи, което със сигурност ще окаже положително влияние за конкретната страница както и за сайта като цяло.

 

Tags:

SEO

Resolving ":

by mitkoka 4. Декември 2008 08:28
Interesting.I did't know until now that if some string contains ":" it can't be resolved.Just the ResolveUrl or the "~/" symbol in Response redirect stay same.So the solution is to remove the ":" from the url.Easy :)

Tags:

ASP.NET

Cannot use a leading .. to exit above the top directory.

by mitkoka 1. Декември 2008 06:12

I have a very strange problem on my web site. I'm rewriting this url:

http://localhost:4232/PAGE/hhhhh.ASPX

to this:

http://localhost:4232//page.aspx?id=969534b0-5812-4896-bd77-7e37249ca4ba

but I'm getting this error: Cannot use a leading .. to exit above the top directory.

I've cheched everythig and finaly solve it.In the MasterPage there's a logo whitin a hyperlink:

    <asp:HyperLink ID="hypLogo" NavigateUrl="~/Default.aspx" ImageUrl="~/images/logo.gif"
                    runat="server"></asp:HyperLink>

It seams that the problem is in the addres of the logo  ImageUrl="~/images/logo.gif".When I remove the "~" it works fine. By rewriting the URL I change the relative position of the logo image. The site trys to look for the image beyond the root directory and that's the reason why this error appears.

In fact the problem dosen't exist if I just use an image server control.This <asp:Image ID="Image1" ImageUrl="~/images/logo.jpg" runat="server" /> dosn't cause any problems. It seem like it is related only to  hyper link server control.

 

Tags:

ASP.NET

Сайтът ми не се зарежда

by mitkoka 25. Ноември 2008 04:21

По някаква странна причина сайтът ми спря да се зарежда. Не мога да разбера какво точно се получи. Рестартирах приложението ми като презаписах web.config-а и в следващият момент то просто спря да се зарежда. Лошото в случая е че не ми дава никаква грешка и не мога да разбера какво се случва. Използвам IIS7. След многокртни опити да стартирам приложението като възстановя последните промени в кода стигнах до това да изстрия по - голямата част от сайта и да я какча наново с надеждата, че така ще реша проблема.Пропуснах да кажа, че приложението работи прекрасно на локалната машина. Проблемът е само на сървъра. Някакви коментари и съвети ще ми бъдат от полза.

В крайна сметка намерих причинителя на проблема. Оказа се че има безконечен цикъл в един от контролите зареждащи се в default.aspx. Понякога нещата са точно такива каквито изглеждат.;)

Tags:

ASP.NET

IIS Акаунти

by mitkoka 22. Ноември 2008 17:43
IIS по принцип работи с два типа акаунти в зависимост от операционната система.При windows XP това е ASPNET.При Windows SERVER 2003 по подразбиране акаунта е NETWORK SERVICE.Затова независимо от това как сме определели сигурноста от настройките на IIS (Anonymous Access or Basic / Integrated security ) акаунта винаги е този. Това обаче може да бъде променено.Ако в web.config сложим identity impersonate="true" тогава акаунта ще бъде IUSR_MachineName.За да бъде ползван този акаунт обаче трябва да бъде чекнат use annonimus accaunt в IIS. Ако вместо аннонимен достъп се използва Basic or Integrated Security то тогава акаунта който използва IIS ще бъде този с който е влязъл потребителя. Друга възможност е да се опредли акаунта който искаме да използваме като вкараме атрибути userName and password в identity impersonate="true" .

Tags:

ASP.NET

Достъп до елементите на колекция от data контроли

by mitkoka 22. Ноември 2008 17:34

 Ето как става достъпа до елементите на източника на data контроли като dataList, repeater или gridview

  Array of Strings:

 VB/C# <%# Container.DataItem %>

Field from DataView:

  VB <%# Container.DataItem("EmployeeName") %>

  C# <%# ((DataRowView)Container.DataItem)["EmployeeName"] %>

 Property from a collection of objects:

  VB <%# Container.DataItem.CustomerName %>

  C# <%# ((Customer)Container.DataItem).CustomerName %>

  Non-String property from a collection of objects:

  VB <%# CStr(Container.DataItem.CustomerID) %>

  C# <%# ((Customer)Container.DataItem).CustomerID.ToString() %>

 По този начин се осигурява достъп до текущия елемент на източнка.

Tags:

C#

NHibernate

by mitkoka 22. Ноември 2008 05:46

 

NHibernate

 

NHibernate представлява обектно – релационен мапър изграден на основата на Hibernate ver. 2.1.Последната версия на NHibernate e 1.2.1 и включва доста функции от Hibernate 3 както и подръжка на .NET 2.0, съхранени процедури и дженерикс типове.В момента се разработва версия 2.0.

Моделирането възоснова на обектно - релационния модел представлява преобразуване на релационния модел на базите данни до обектно ориентиран вид чрез съответствия от вида клас – таблица и свойство – колона.Този подход за моделиране се нарича Data Mapper.

При работа с Hibernate(NHibernate) най - общо процедурата е следната:Създаваме клас съответстващ на предварително създадена таблица в база данни.Този клас има полета и свойства съответстващи на колони от съответната таблица.При компилирането на този фаил NHibernete ще достъпва тези полета чрез рефлекция.

След като имаме таблица и съответстващ на нея клас трябва да направим фаил за съответствията (map file).Това е xml фаил съдържащ съответствията между таблицата и класа.Записва се с разширение (име на клас).hbm.xml и трябва да бъде записан като embedded resource за да бъде част от асеблито.При дефинирането на съответствията трябва да се окаже асемблито за да може NHibernate-a да го открие.

Също така трябва да имаме и кофигурационен фаил, който да описва текущата конфигурация на NHibernate-a.

Конфигуриране на NHibernate

Конфигурирането може да стане програмно или чрез XML фаил.Тъй като NHibernate предоставя богати възможности за работа с различни бази данни съществуват множество променливи, чрез които може да стане конфигурацията.При програмното конфигуриране подаваме IDictionary колекция от променливи на Configuration.SetProperties().При използването на XML фаил имаме няколко възможности.Можем да създадем конфигурационна секция за NHibernate в кофигурационния фаил на приложението.Той би могъл да бъде например web.config.Тази секция трябва да се казава<nhibernate>.Също така може да се използва специален конфигурационнен фаил hibernate.cfg.xml, който да съдържа единствено ифнормация за кофигурирането на NHibernate.Записването на стойностите на свойствата в кофигурациония фаил става чрез атрибут <add key=”” value=”” />

Кофигуриането на връзката с базата данни става чрез задаване на стойности на променливите отговарящи за това.

Променливите включват определяне на hibernate.connection.provider_class като NHibernate поддържа собствени класове, които могат да бъдат зададени като стойност.В противен случай може да се използва асембли и клас имлементиращ IConnectionProvider.Същото се отнася и за променливата hibernate.connection.driver_class.Определя се и стойност, на hibernate.connection.connection_string и hibernate.dialect hibernate.dialect.Последната съдържа информация за базата данни която ще достъпваме.Стойностите на тзаи променлива са предварително определени според това какви бази данни поддържа версията на NHibernate – а, с която се работи.Поддържат се всички известни бази данни.

 

Файолве на съответствията (Мапинг файолве)

В  тези файлове записваме връската между таблиците и класовете.Един xml фаил може да съдържа повече от един клас.Могат да бъдат написани ръчно или да се използват специални инструменти генериращи .hbm.xml документи.Това какви елемнти ще съдържа мапинг файла зависи от конкретната таблица и връзките и с останалите таблици.Мапинг файловете са написани object-centric, което означава че са създадени спрямо структурата на класовете а не на таблиците. 

<hibernate-mapping> - това е елементът, в който посочваме място на нашия клас.Това става с елементите namespace и assembly.Атрибутите в този елемент не са задължителни.

<class> - Това е елементът определящ връзката таблица -  клас.Поделементите му от своя страна определят връзката име на колона – свойство.Единствените задължителни атрибути тук са table и name.Възможно е да се постави като атрибут  where - SQL клауза с цел да се извлвче определена част от таблицата.Може да бъде зададено как ще става записването на данните в таблицата.Определя се също дали при зареждане на даден обект ще бъдат зареждани и неговите под обекти при по – сложна йерархия от класове.

В клас елемента се поставя поделемент <id>, който ни дава уникален идентификатор на инстанцията на класа и първичния ключ от таблицата.<id> елемента съдържа под елемент <generator> генериращ идентификатора ако трябва да се подадат някакви параметри се използва елемент <param>.Подаваме различни параметри според това каква база данни използваме.Например sequence за Oracle и identity за MS SQL Server.

Когато имаме копозитетeн първичен ключ, тогава трябва да се запише всяка една колона от таблицата, определяща този ключ в отделен <key-property> елеменът.Тогава вмсето <id> използваме <composite – id>.

<discriminator> елементът, част от <class> секцията определя колона в таблицата, която ще бъде използвана като дискриминатор.Стойноста в тази колона се използва, когато в основния клас имаме клсове наследници на общ клас.Тогава стойноста в тази колона определя какъв клас да бъде инстанциран.Наличието на дискриминатор осигурява полиморфизъм на класовете наследници на базовия.

Елементът <property> осигурява връзката колона – свойство.Той е част от <class> елемента.Задължителен атрибут е именто на свойството от клас.Ако не бъде посчена колона от таблица, по-подразбиране се търси колона с името на свойството.Типът на данните също не е задължителен – може да бъде определен от посоченето асембли.

<may-to-one> и <one-to-one> са елементи, чрез които се посочва връзка към друг клас изразяващ на таблица.Единствения задължителен елемент тук е property, който определя свойство от външния клас.Ако е зададено само свойство тогава колната на таблицата съдържаща външния ключ съвпада с името на свойството, а класа в който се намира свойството се определя чрез рефлекция.Типът на свойството определя подразбиращата се стойност на елемета class.Има възможност да бъде посочена колона с уникални стойости от външната таблица, която не представлява първичен ключ.Ако това не бъде направено по подразбиране се използва колоната с първичния ключ.

В случай, че имаме базов клас с един или повече наследника, а в таблицата съответстваща на този клас имаме колона дискримитор, която се грижи за полиморфизма на базовия клас трябва да изразим това в мапинг файла.Това става чрез елемент <subclass>.Като атрибут на този елемент посочваме стойност  съдържаща се в колоната дискриминататор discriminator-value.Така се определя какъв клас съответсва на всеки ред от таблицата. Ако под клсаовете са в отделна таблица тогва се използва елемента <joined- subclass>.Тъй като всеки клас наследник в този случай има собствена таблица в базата колона за дискриминатор не съществува и съответно нямаме атрибут discriminator-value.Останалите атрибути са същите както при <subclass> елемента.

В файла на съответствията има възможност да бъдата посочвани коленкциите садържащи се в калса.За това се грижат елементите <set>, <list>, <map>, <bag>, <array> и <primitive-array>.Важно е да се отбележи, че NHibernate изисква колекциите в класовете да бъдата декларирани чрез интерфейс.Колекцията съдържаща се в една таблица има собствена таблица.В рамките на един елемент отразчващ колекция се записва връзката между таблицата на каласа и таблицата на колекцията <one-to-many>, <many-to-many>.Посочват се също колоните, чрез които ще се осъществи връзката между отделните таблици.

Колекциите съдържат елемент lazy.Чрез него се определя кога колекцията да бъде заредена.За да не се хабят ресурси колекцията може да бъде заредена когато действително има нужда от нея.

 

Методи за получаване на обекти от база  данни

Чрез NHibernate имаме възможност да извличаме обекти както от таблици така и от изгледи(view) .Това става като вместо име на таблица забишем име на изглед в атрибута <class>.

Начините за обработка на данни в чрез NHibernate са следните:

<!--[if !supportLists]-->·         <!--[endif]-->Чрез HQL(Hibernate Query Language)

<!--[if !supportLists]-->·         <!--[endif]-->Чрез стандартен SQL

<!--[if !supportLists]-->·         <!--[endif]-->Чрез  Query By Criteria (QBC) и Query By Example (QBE)

Препоръчва се изплозването на HQL пред останалите два метода.Това е език подобен на SQL но по – гъвкав от него, защото предоставя допълнителна функционалност.За разлика от SQL  той не използва таблици и колони, а класове и свойства.Също така HQL връща дирктно обект, а това че работи с обекти му дава възможност да доразвие стандартния sql до обеkтно ориентиран език.

Можем да извличаме данни и чрез използването на NHibernate.ICriteria, който изразва заявка към базата.За създаването на ICriteria обект се използва ISession обект.Ако не бъдат зададени критерии към заявката то тя просто ще върне всички данни от съответната таблица.

ICriteria crit = sess.CreateCriteria(typeof(Cat));

List cats = crit.List();

Могат да бъдат задавани всякакви SELECT чрез методите на клас NHibernate.Expression.Expression, чрез който можем да добавим определени ограничения на връщаните рзултати:

IList cats = sess.CreateCriteria(typeof(Cat))
.Add( Expression.Like(“Name”, “Fritz%”) )
.Add( Expression.Between(“Weight”, minWeight, maxWeight) )
.List();

Влкючват се ралични методи, с които се филтрират данните идващи от заявката.Възможно е и да се добави чист SQL към критерите на заявката без да се използват останалите методи на класа Expressinon.

Заявки могат да бъдат подавани и чрез конкретен обект.Създаваме обекта на класа към чиято таблица ще бъде отправена заявката и го подаваме със съответните стойности на метода Create() на клас  NHibernate.Expression.Example.

Използването на SQL в NHibernate става чрез ISQLQuery.Методът  ISession.CreateSQLQuery() взема като аргумент SQL заявката и връща Query обект.От този обект се извлича информацията като се извикват неговите методи определящи например вида на изходните данни – дали да бъдат представени като обекти или да бъдат просто стойности.Чрез методът SetString() добавяме параметрите към заявката ако има такива,а данните излизат от Query обекта чрез извикването на метода List(), който връща IList.

В NHibernate могат да се използват и наименовани SQL заявки(Named SQL queries).Тези заявки се пишат директно в мапинг файла и се извикват прогрмано чрез името, което им е зададено.По този начин могат да бъдат извиквани и съхранени процедури.Във файла на съответствията се записват данните които трябва да бъдат получени от съхранената процедура (ResultSet).Самата съхранена процедура се извиква според това с каква база работим.

 

 

Tags:

ASP.NET | C#

Референтни и стойностни параметри

by mitkoka 22. Ноември 2008 05:38

Преди да се прочете тази статия трябва добре да се осмисли разликата между стойностни и референтни типове (или парамети както ще използвам в статията тъй като става въпрос за методи) и типове подадени по стойност и по референция.В първия случай просто става въпрос за различни типове параметри, а във втория за тяхното използване в методите!

Също така трябва да се знае какво точно означава:

 

Myclass a = new Mycalss();

 

А то означава следните три неща:

 

1. Създаване на референция (Myclass a)

2. Създаване на обект (new Myclass();)

3. Насочване на референцията към обекта (=).

 

Тук напрактика се правят два записа в паметта един в стека и един в хиипа, които са две съвсем различни неща на съвсем различни места, въпреки че едното гледа към другото.

 

 

ПОДАВАНЕ НА ПАРАМЕТЪР ПО СТОЙНОСТ

 

Референтни типове(параметри)

Когато се подават параметри на даден метод те по принцип биват подавани по стойност (въпреки, че това са референеции).За да бъдат подадени като такива не

се изсиква поставянето на ключова дума пред параметъра.Подаденият по стойност параметър води до заделяне на ново място за него или с други думи се направи копие на подадения параметър в стека. Затова промяна на неговата стойност при изпълнение на метода няма да прдизвика промяна на оригиналния параметър подаден на метода.Просто ще се пренасочи референцията в друга посока.Това може означава че на параметъра ще се зададе стойност null или ще се посочи друго място в хиипа съответно друг обект (от същият тип разбира се).Но ако извикаме метод на подадения параметър то ние викаме метод на обеката, към който сочат и оригиналния параметър и този, който се използва в метода.Ето защо това ще доведе до промяна на обекта и ще рефлектира върху оригиналният параметър!!!

 

Стойностни типове(параметри)

Какво би се получило ако параметърът подаден на метода е от стойностен тип?

Тук подавеме стойностен тип и методът прави копие на стойноста му (Важно е да припомня, че стойностния тип представлява самите данни а не връзка към тях???????). Ето защо всяка промяната на подадената стойност не води до промяна на оригиналната стойност. Ако извикаме метод на стойностния тип той няма да промени оригиналният обект както би се случило при референтните типове, които биха се обърнат към обект в хиипа.

 

Общо казано подаването на параметър на функция означва неговото копиране така, че оригиналният паранетър да не може да бъде променен в

процеса на изпълнение на фукцията.

 

ПОДАВАНЕ НА ПАРАМЕТЪР ПО РЕФЕРЕНЦИЯ

 

Референтни типове

За да се подаде параметър по референция пред параметъра се слага ключова дума ref.Разликата от подаването по стойност е че тук не се прави копие на параметъра а се работи с подадения.Това означава, че работим с оригиналния параметър и всяка промяна направена върху параметъра в метода ще доведе до промяна на подадения оригинален параметър.Например ако методът променя посоката на параметъра на null или посочва нов обект (= new Myclass(); като естествно параметъра също е MyClass()) това ще доведе до промяна на оригиналния параметър който също ще бъде насочен към null или към Myclass();

 

Стойностни типове

Логично при подаването на стойностен тип по референция подаваме самите данни и методът работи със самият оригинален обект.Няма копиране - подаваш оригинала!!!

 

 

Дано написъното не е объркващо.Темата не е слжожна, но понятията лесно могат да бъдат объркани.Например можем да имаме стойностно податане на референтен тип и референтно подаване на стойностен тип.Или да кажем, ако не е оказно друго подавантето на обект става стойностно по референция или подаването на референция става стойностно. 

Tags:

C#